2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: lib/drivers/chew/workqueue.c
5 * PURPOSE: Common Highlevel Executive Worker
7 * PROGRAMMERS: arty (ayerkes@speakeasy.net)
11 #include <chew/chew.h>
16 #define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z))
17 #define CHEW_TAG FOURCC('C','H','E','W')
19 PDEVICE_OBJECT WorkQueueDevice
;
21 KSPIN_LOCK WorkQueueLock
;
22 KEVENT WorkQueueClear
;
24 typedef struct _WORK_ITEM
27 PIO_WORKITEM WorkItem
;
28 VOID (*Worker
)(PVOID WorkerContext
);
30 } WORK_ITEM
, *PWORK_ITEM
;
32 VOID
ChewInit(PDEVICE_OBJECT DeviceObject
)
34 WorkQueueDevice
= DeviceObject
;
35 InitializeListHead(&WorkQueue
);
36 KeInitializeSpinLock(&WorkQueueLock
);
37 KeInitializeEvent(&WorkQueueClear
, NotificationEvent
, TRUE
);
40 VOID
ChewShutdown(VOID
)
42 KeWaitForSingleObject(&WorkQueueClear
, Executive
, KernelMode
, FALSE
, NULL
);
45 VOID NTAPI
ChewWorkItem(PDEVICE_OBJECT DeviceObject
, PVOID ChewItem
)
47 PWORK_ITEM WorkItem
= ChewItem
;
50 WorkItem
->Worker(WorkItem
->WorkerContext
);
52 IoFreeWorkItem(WorkItem
->WorkItem
);
54 KeAcquireSpinLock(&WorkQueueLock
, &OldIrql
);
55 RemoveEntryList(&WorkItem
->Entry
);
57 if (IsListEmpty(&WorkQueue
))
58 KeSetEvent(&WorkQueueClear
, 0, FALSE
);
60 KeReleaseSpinLock(&WorkQueueLock
, OldIrql
);
62 ExFreePoolWithTag(WorkItem
, CHEW_TAG
);
65 BOOLEAN
ChewCreate(VOID (*Worker
)(PVOID
), PVOID WorkerContext
)
68 Item
= ExAllocatePoolWithTag(NonPagedPool
,
74 Item
->WorkItem
= IoAllocateWorkItem(WorkQueueDevice
);
81 Item
->Worker
= Worker
;
82 Item
->WorkerContext
= WorkerContext
;
83 ExInterlockedInsertTailList(&WorkQueue
, &Item
->Entry
, &WorkQueueLock
);
84 KeResetEvent(&WorkQueueClear
);
85 IoQueueWorkItem(Item
->WorkItem
, ChewWorkItem
, DelayedWorkQueue
, Item
);