X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fworkqueue.c;h=3e35b069ead04355075ee4eb9b0b8953e6ea60a4;hb=2462d860630674d10d554f86aa669163f6f2db6b;hp=b1a63851fdf27a8c1d87ac92f8e8b792661a3a26;hpb=48743e39650eb1ef988380e9d95f27fd40d3a9ce;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/workqueue.c b/KernelLand/Kernel/workqueue.c index b1a63851..3e35b069 100644 --- a/KernelLand/Kernel/workqueue.c +++ b/KernelLand/Kernel/workqueue.c @@ -9,6 +9,8 @@ #include #include +#define QUEUENEXT(ptr) (*( (void**)(ptr) + Queue->NextOffset/sizeof(void*) )) + // === CODE === void Workqueue_Init(tWorkqueue *Queue, const char *Name, size_t NextOfset) { @@ -18,8 +20,6 @@ void Workqueue_Init(tWorkqueue *Queue, const char *Name, size_t NextOfset) void *Workqueue_GetWork(tWorkqueue *Queue) { - tThread *us; - for( ;; ) { // Check for work @@ -27,29 +27,16 @@ void *Workqueue_GetWork(tWorkqueue *Queue) if(Queue->Head) { void *ret = Queue->Head; - Queue->Head = *( (void**)ret + Queue->NextOffset/sizeof(void*) ); + Queue->Head = QUEUENEXT( ret ); if(Queue->Tail == ret) Queue->Tail = NULL; SHORTREL(&Queue->Protector); return ret; } - // Go to sleep - SHORTLOCK(&glThreadListLock); - us = Threads_RemActive(); - us->WaitPointer = Queue; - us->Status = THREAD_STAT_QUEUESLEEP; - Queue->Sleeper = us; - SHORTREL(&Queue->Protector); - SHORTREL(&glThreadListLock); - - // Yield and sleep - Threads_Yield(); - if(us->Status == THREAD_STAT_QUEUESLEEP) { - // Why are we awake?! - } - - us->WaitPointer = NULL; + Threads_int_Sleep(THREAD_STAT_QUEUESLEEP, + Queue, 0, + &Queue->Sleeper, NULL, &Queue->Protector); } } @@ -58,11 +45,12 @@ void Workqueue_AddWork(tWorkqueue *Queue, void *Ptr) SHORTLOCK(&Queue->Protector); if( Queue->Tail ) - *( (void**)Queue->Tail + Queue->NextOffset/sizeof(void*) ) = Ptr; + QUEUENEXT(Queue->Tail) = Ptr; else Queue->Head = Ptr; Queue->Tail = Ptr; - + QUEUENEXT(Ptr) = NULL; + if( Queue->Sleeper ) { if( Queue->Sleeper->Status != THREAD_STAT_ACTIVE )