2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS TCP/IP protocol driver
5 * PURPOSE: Common Highlevel Executive Worker
6 * PROGRAMMERS: Art Yerkes
8 * CSH 10/12-2005 Created
11 #include <chew/chew.h>
15 #define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z))
17 PDEVICE_OBJECT WorkQueueDevice
;
19 KSPIN_LOCK WorkQueueLock
;
21 typedef struct _WORK_ITEM
{
23 PIO_WORKITEM WorkItem
;
24 VOID (*Worker
)( PVOID Data
);
26 } WORK_ITEM
, *PWORK_ITEM
;
28 VOID
ChewInit( PDEVICE_OBJECT DeviceObject
) {
29 WorkQueueDevice
= DeviceObject
;
30 InitializeListHead( &WorkQueue
);
31 KeInitializeSpinLock( &WorkQueueLock
);
39 KeAcquireSpinLock( &WorkQueueLock
, &OldIrql
);
41 while( !IsListEmpty( &WorkQueue
) ) {
42 Entry
= RemoveHeadList( &WorkQueue
);
43 WorkItem
= CONTAINING_RECORD( Entry
, WORK_ITEM
, Entry
);
44 IoFreeWorkItem( WorkItem
->WorkItem
);
45 ExFreePool( WorkItem
);
48 KeReleaseSpinLock( &WorkQueueLock
, OldIrql
);
51 VOID STDCALL
ChewWorkItem( PDEVICE_OBJECT DeviceObject
, PVOID ChewItem
) {
52 PWORK_ITEM WorkItem
= ChewItem
;
54 if( WorkItem
->Worker
)
55 WorkItem
->Worker( WorkItem
->UserSpace
);
57 IoFreeWorkItem( WorkItem
->WorkItem
);
58 ExFreePool( WorkItem
);
62 ( PVOID
*ItemPtr
, UINT Bytes
, VOID (*Worker
)( PVOID
), PVOID UserSpace
) {
64 if( KeGetCurrentIrql() == PASSIVE_LEVEL
) {
69 Item
= ExAllocatePoolWithTag
71 sizeof( WORK_ITEM
) + Bytes
- 1,
72 FOURCC('C','H','E','W') );
75 Item
->WorkItem
= IoAllocateWorkItem( WorkQueueDevice
);
76 if( !Item
->WorkItem
) {
80 Item
->Worker
= Worker
;
81 if( Bytes
&& UserSpace
)
82 RtlCopyMemory( Item
->UserSpace
, UserSpace
, Bytes
);
84 ExInterlockedInsertTailList
85 ( &WorkQueue
, &Item
->Entry
, &WorkQueueLock
);
87 ( Item
->WorkItem
, ChewWorkItem
, CriticalWorkQueue
, Item
);
97 VOID
ChewRemove( PVOID Item
) {
98 PWORK_ITEM WorkItem
= Item
;
99 IoFreeWorkItem( WorkItem
->WorkItem
);
100 ExFreePool( WorkItem
);