2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: drivers/lib/chew/workqueue.c
5 * PURPOSE: Common Highlevel Executive Worker
7 * PROGRAMMERS: arty (ayerkes@speakeasy.net)
10 #include <chew/chew.h>
14 #define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z))
16 PDEVICE_OBJECT WorkQueueDevice
;
18 KSPIN_LOCK WorkQueueLock
;
20 typedef struct _WORK_ITEM
{
22 PIO_WORKITEM WorkItem
;
23 VOID (*Worker
)( PVOID Data
);
25 } WORK_ITEM
, *PWORK_ITEM
;
27 VOID
ChewInit( PDEVICE_OBJECT DeviceObject
) {
28 WorkQueueDevice
= DeviceObject
;
29 InitializeListHead( &WorkQueue
);
30 KeInitializeSpinLock( &WorkQueueLock
);
38 KeAcquireSpinLock( &WorkQueueLock
, &OldIrql
);
40 while( !IsListEmpty( &WorkQueue
) ) {
41 Entry
= RemoveHeadList( &WorkQueue
);
42 WorkItem
= CONTAINING_RECORD( Entry
, WORK_ITEM
, Entry
);
43 IoFreeWorkItem( WorkItem
->WorkItem
);
44 ExFreePool( WorkItem
);
47 KeReleaseSpinLock( &WorkQueueLock
, OldIrql
);
50 VOID STDCALL
ChewWorkItem( PDEVICE_OBJECT DeviceObject
, PVOID ChewItem
) {
51 PWORK_ITEM WorkItem
= ChewItem
;
53 RemoveEntryList( &WorkItem
->Entry
);
55 if( WorkItem
->Worker
)
56 WorkItem
->Worker( WorkItem
->UserSpace
);
58 IoFreeWorkItem( WorkItem
->WorkItem
);
59 ExFreePool( WorkItem
);
63 ( PVOID
*ItemPtr
, UINT Bytes
, VOID (*Worker
)( PVOID
), PVOID UserSpace
) {
66 if( KeGetCurrentIrql() == PASSIVE_LEVEL
) {
72 Item
= ExAllocatePoolWithTag
74 sizeof( WORK_ITEM
) + Bytes
- 1,
75 FOURCC('C','H','E','W') );
78 Item
->WorkItem
= IoAllocateWorkItem( WorkQueueDevice
);
79 if( !Item
->WorkItem
) {
83 Item
->Worker
= Worker
;
84 if( Bytes
&& UserSpace
)
85 RtlCopyMemory( Item
->UserSpace
, UserSpace
, Bytes
);
87 ExInterlockedInsertTailList
88 ( &WorkQueue
, &Item
->Entry
, &WorkQueueLock
);
90 ( Item
->WorkItem
, ChewWorkItem
, CriticalWorkQueue
, Item
);
102 VOID
ChewRemove( PVOID Item
) {
103 PWORK_ITEM WorkItem
= Item
;
104 IoFreeWorkItem( WorkItem
->WorkItem
);
105 ExFreePool( WorkItem
);