#include "kernel/barrier.h" void barrierInit(Barrier* b) { mutexInit(&b->mutex); mutexLock(&b->mutex); if(b->isInited) { return; } listInit(&b->threads_registered); listInit(&b->threads_waiting); b->isInited = true; mutexUnlock(&b->mutex); } void barrierFree(Barrier* b) { mutexLock(&b->mutex); if(!b->isInited) { return; } listFree(&b->threads_registered); listFree(&b->threads_waiting); b->isInited = false; mutexUnlock(&b->mutex); } void barrierRegister(Barrier* b, Thread* thread) { if(listIsInserted(&b->threads_registered, (void*)thread)) { return; } listInsertLast(&b->threads_registered, (void*)thread); } void barrierUnregister(Barrier* b, Thread* thread) { listDelete(&b->threads_registered, (void*)thread); } void barrierWait(Barrier* b, Thread* thread) { if(!listIsInserted(&b->threads_registered, thread)) { return; } mutexLock(&b->mutex); if(listGetNumNodes(&b->threads_registered) == listGetNumNodes(&b->threads_waiting)+1) { while(listGetNumNodes(&b->threads_waiting) > 0) { Thread* current_thread = listGetItem(&b->threads_waiting, 0); threadResume(current_thread); listDelete(&b->threads_waiting, current_thread); } mutexUnlock(&b->mutex); } else { listInsertLast(&b->threads_waiting, thread); mutexUnlock(&b->mutex); threadPause((void*)thread); } }