A little library for making it easier to get to PASSIVE_LEVEL. Just contains boilerplate for using work items. Added: trunk/reactos/drivers/lib/chew/ Added: trunk/reactos/drivers/lib/chew/chew.xml Added: trunk/reactos/drivers/lib/chew/workqueue.c Added: trunk/reactos/include/chew/ Added: trunk/reactos/include/chew/chew.h Property changes on: trunk/reactos/drivers/lib/chew ___________________________________________________________________ Name: eol-style + native Name: eol-style:native + include\chew _____
Added: trunk/reactos/drivers/lib/chew/chew.xml --- trunk/reactos/drivers/lib/chew/chew.xml 2005-12-11 08:11:21 UTC (rev 20054) +++ trunk/reactos/drivers/lib/chew/chew.xml 2005-12-11 08:26:16 UTC (rev 20055) @@ -0,0 +1,7 @@
+<module name="chew" type="staticlibrary"> + <define name="__USE_W32API" /> + <define name="_NTOSKRNL_" /> + <include base="chew">include</include> + <include base="reactos">w32api/include/ddk</include> + <file>workqueue.c</file> +</module> \ No newline at end of file _____
Added: trunk/reactos/drivers/lib/chew/workqueue.c --- trunk/reactos/drivers/lib/chew/workqueue.c 2005-12-11 08:11:21 UTC (rev 20054) +++ trunk/reactos/drivers/lib/chew/workqueue.c 2005-12-11 08:26:16 UTC (rev 20055) @@ -0,0 +1,101 @@
+/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS TCP/IP protocol driver + * FILE: tcpip/main.c + * PURPOSE: Common Highlevel Executive Worker + * PROGRAMMERS: Art Yerkes + * REVISIONS: + * CSH 10/12-2005 Created + */ +#include <ntddk.h> +#include <chew/chew.h> + +//#define NDEBUG + +#define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z)) + +PDEVICE_OBJECT WorkQueueDevice; +LIST_ENTRY WorkQueue; +KSPIN_LOCK WorkQueueLock; + +typedef struct _WORK_ITEM { + LIST_ENTRY Entry; + PIO_WORKITEM WorkItem; + VOID (*Worker)( PVOID Data ); + CHAR UserSpace[1]; +} WORK_ITEM, *PWORK_ITEM; + +VOID ChewInit( PDEVICE_OBJECT DeviceObject ) { + WorkQueueDevice = DeviceObject; + InitializeListHead( &WorkQueue ); + KeInitializeSpinLock( &WorkQueueLock ); +} + +VOID ChewShutdown() { + KIRQL OldIrql; + PLIST_ENTRY Entry; + PWORK_ITEM WorkItem; + + KeAcquireSpinLock( &WorkQueueLock, &OldIrql ); + + while( !IsListEmpty( &WorkQueue ) ) { + Entry = RemoveHeadList( &WorkQueue ); + WorkItem = CONTAINING_RECORD( Entry, WORK_ITEM, Entry ); + IoFreeWorkItem( WorkItem->WorkItem ); + ExFreePool( WorkItem ); + } + + KeReleaseSpinLock( &WorkQueueLock, OldIrql ); +} + +VOID STDCALL ChewWorkItem( PDEVICE_OBJECT DeviceObject, PVOID ChewItem ) { + PWORK_ITEM WorkItem = ChewItem; + + if( WorkItem->Worker ) + WorkItem->Worker( WorkItem->UserSpace ); + + IoFreeWorkItem( WorkItem->WorkItem ); + ExFreePool( WorkItem ); +} + +BOOLEAN ChewCreate +( PVOID *ItemPtr, UINT Bytes, VOID (*Worker)( PVOID ), PVOID UserSpace ) { + PWORK_ITEM Item; + if( KeGetCurrentIrql() == PASSIVE_LEVEL ) { + *ItemPtr = NULL; + Worker(UserSpace); + return TRUE; + } else { + Item = ExAllocatePoolWithTag + ( NonPagedPool, + sizeof( WORK_ITEM ) + Bytes - 1, + FOURCC('C','H','E','W') ); + + if( Item ) { + Item->WorkItem = IoAllocateWorkItem( WorkQueueDevice ); + if( !Item->WorkItem ) { + ExFreePool( Item ); + return FALSE; + } + Item->Worker = Worker; + if( Bytes && UserSpace ) + RtlCopyMemory( Item->UserSpace, UserSpace, Bytes ); + + ExInterlockedInsertTailList + ( &WorkQueue, &Item->Entry, &WorkQueueLock ); + IoQueueWorkItem + ( Item->WorkItem, ChewWorkItem, CriticalWorkQueue, Item ); + + *ItemPtr = Item; + + return TRUE; + } else + return FALSE; + } +} + +VOID ChewRemove( PVOID Item ) { + PWORK_ITEM WorkItem = Item; + IoFreeWorkItem( WorkItem->WorkItem ); + ExFreePool( WorkItem ); +} _____
Added: trunk/reactos/include/chew/chew.h --- trunk/reactos/include/chew/chew.h 2005-12-11 08:11:21 UTC (rev 20054) +++ trunk/reactos/include/chew/chew.h 2005-12-11 08:26:16 UTC (rev 20055) @@ -0,0 +1,10 @@
+#ifndef _REACTOS_CHEW_H +#define _REACTOS_CHEW_H + +VOID ChewInit( PDEVICE_OBJECT DeviceObject ); +VOID ChewShutdown(); +BOOLEAN ChewCreate +( PVOID *Item, UINT Bytes, VOID (*Worker)(PVOID), PVOID UserSpace ); +VOID ChewRemove( PVOID Item ); + +#endif/*_REACTOS_CHEW_H*/