Working work item library.
- Slightly changed semantics of ChewCreate: the work may be performed
inline if we're in the right irql already.
- The user data is copied automatically if the call succeeds and a work
item is created.
- The address of the work item is returned through an argument if it
was allocated.
Modified: trunk/reactos/drivers/lib/chew/workqueue.c
Modified: trunk/reactos/include/chew/chew.h
_____
Modified: trunk/reactos/drivers/lib/chew/workqueue.c
--- trunk/reactos/drivers/lib/chew/workqueue.c 2005-12-12 22:00:16 UTC
(rev 20126)
+++ trunk/reactos/drivers/lib/chew/workqueue.c 2005-12-12 22:01:32 UTC
(rev 20127)
@@ -1,16 +1,15 @@
/*
- * 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
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: drivers/lib/chew/workqueue.c
+ * PURPOSE: Common Highlevel Executive Worker
+ *
+ * PROGRAMMERS: arty (ayerkes(a)speakeasy.net)
*/
#include <ntddk.h>
#include <chew/chew.h>
-//#define NDEBUG
+#define NDEBUG
#define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z))
@@ -51,6 +50,8 @@
VOID STDCALL ChewWorkItem( PDEVICE_OBJECT DeviceObject, PVOID ChewItem
) {
PWORK_ITEM WorkItem = ChewItem;
+ RemoveEntryList( &WorkItem->Entry );
+
if( WorkItem->Worker )
WorkItem->Worker( WorkItem->UserSpace );
@@ -61,8 +62,10 @@
BOOLEAN ChewCreate
( PVOID *ItemPtr, UINT Bytes, VOID (*Worker)( PVOID ), PVOID UserSpace
) {
PWORK_ITEM Item;
+
if( KeGetCurrentIrql() == PASSIVE_LEVEL ) {
- *ItemPtr = NULL;
+ if( ItemPtr )
+ *ItemPtr = NULL;
Worker(UserSpace);
return TRUE;
} else {
@@ -85,12 +88,14 @@
( &WorkQueue, &Item->Entry, &WorkQueueLock );
IoQueueWorkItem
( Item->WorkItem, ChewWorkItem, CriticalWorkQueue, Item
);
+
+ if( ItemPtr )
+ *ItemPtr = Item;
- *ItemPtr = Item;
-
return TRUE;
- } else
+ } else {
return FALSE;
+ }
}
}
_____
Modified: trunk/reactos/include/chew/chew.h
--- trunk/reactos/include/chew/chew.h 2005-12-12 22:00:16 UTC (rev
20126)
+++ trunk/reactos/include/chew/chew.h 2005-12-12 22:01:32 UTC (rev
20127)
@@ -1,10 +1,40 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: include/chew/chew.h
+ * PURPOSE: Common Highlevel Executive Worker
+ *
+ * PROGRAMMERS: arty (ayerkes(a)speakeasy.net)
+ */
+
#ifndef _REACTOS_CHEW_H
#define _REACTOS_CHEW_H
+/**
+ * Initialize CHEW, given a device object (since IoAllocateWorkItem
relies on
+ * it).
+ */
VOID ChewInit( PDEVICE_OBJECT DeviceObject );
+/**
+ * Shutdown CHEW, including removing remaining work items.
+ */
VOID ChewShutdown();
+/**
+ * Create a work item, or perform the work, based on IRQL.
+ * At passive level, Worker is called directly on UserSpace.
+ * At greater than passive level, a work item is created with Bytes
+ * context area and data copied from UserSpace.
+ * If a work item is created, Item contains the address and the
function
+ * returns true.
+ * If the work is performed immediately, Item contains NULL and the
+ * function returns true.
+ * Else, the function returns false and Item is undefined.
+ */
BOOLEAN ChewCreate
( PVOID *Item, UINT Bytes, VOID (*Worker)(PVOID), PVOID UserSpace );
+/**
+ * Remove a work item, given the pointer returned to Item in
ChewCreate.
+ */
VOID ChewRemove( PVOID Item );
#endif/*_REACTOS_CHEW_H*/
Show replies by date