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;
21 void *Workqueue_GetWork(tWorkqueue *Queue)
26 SHORTLOCK(&Queue->Protector);
29 void *ret = Queue->Head;
30 Queue->Head = QUEUENEXT( ret );
31 if(Queue->Tail == ret)
33 SHORTREL(&Queue->Protector);
37 Threads_int_Sleep(THREAD_STAT_QUEUESLEEP,
39 &Queue->Sleeper, NULL, &Queue->Protector);
43 void Workqueue_AddWork(tWorkqueue *Queue, void *Ptr)
45 SHORTLOCK(&Queue->Protector);
48 QUEUENEXT(Queue->Tail) = Ptr;
52 QUEUENEXT(Ptr) = NULL;
56 if( Queue->Sleeper->Status != THREAD_STAT_ACTIVE )
57 Threads_AddActive(Queue->Sleeper);
58 Queue->Sleeper = NULL;
60 SHORTREL(&Queue->Protector);