3 * - By John Hodge (thePowersGang)
6 * - Worker FIFO Queue (Single Consumer, Interrupt Producer)
10 #include <threads_int.h>
12 #define QUEUENEXT(ptr) (*( (void**)(ptr) + Queue->NextOffset/sizeof(void*) ))
15 void Workqueue_Init(tWorkqueue *Queue, const char *Name, size_t NextOfset)
18 Queue->NextOffset = NextOfset;
19 Queue->Sleeper = NULL;
20 Queue->SleepTail = NULL;
23 void *Workqueue_GetWork(tWorkqueue *Queue)
28 SHORTLOCK(&Queue->Protector);
31 void *ret = Queue->Head;
32 Queue->Head = QUEUENEXT( ret );
33 if(Queue->Tail == ret)
35 SHORTREL(&Queue->Protector);
39 Threads_int_Sleep(THREAD_STAT_QUEUESLEEP,
41 &Queue->Sleeper, &Queue->SleepTail, &Queue->Protector);
45 void Workqueue_AddWork(tWorkqueue *Queue, void *Ptr)
47 SHORTLOCK(&Queue->Protector);
50 QUEUENEXT(Queue->Tail) = Ptr;
54 QUEUENEXT(Ptr) = NULL;
58 ASSERTC( Queue->Sleeper->Status, !=, THREAD_STAT_ACTIVE );
59 tThread *next_sleeper = Queue->Sleeper->Next;
60 Threads_AddActive(Queue->Sleeper);
61 Queue->Sleeper = next_sleeper;
63 Queue->SleepTail = NULL;
65 SHORTREL(&Queue->Protector);