Working work item library.
authorArt Yerkes <art.yerkes@gmail.com>
Mon, 12 Dec 2005 22:01:32 +0000 (22:01 +0000)
committerArt Yerkes <art.yerkes@gmail.com>
Mon, 12 Dec 2005 22:01:32 +0000 (22:01 +0000)
- 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.

svn path=/trunk/; revision=20127

reactos/drivers/lib/chew/workqueue.c
reactos/include/chew/chew.h

index 1f041bc..92e07b2 100644 (file)
@@ -1,16 +1,15 @@
 /*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        tcpip/main.c\r
- * PURPOSE:     Common Highlevel Executive Worker\r
- * PROGRAMMERS: Art Yerkes\r
- * REVISIONS:\r
- *   CSH 10/12-2005 Created\r
+ * COPYRIGHT:       See COPYING in the top level directory\r
+ * PROJECT:         ReactOS kernel\r
+ * FILE:            drivers/lib/chew/workqueue.c\r
+ * PURPOSE:         Common Highlevel Executive Worker\r
+ *\r
+ * PROGRAMMERS:     arty (ayerkes@speakeasy.net)\r
  */\r
 #include <ntddk.h>\r
 #include <chew/chew.h>\r
 \r
-//#define NDEBUG\r
+#define NDEBUG\r
 \r
 #define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z))\r
 \r
@@ -51,6 +50,8 @@ VOID ChewShutdown() {
 VOID STDCALL ChewWorkItem( PDEVICE_OBJECT DeviceObject, PVOID ChewItem ) {\r
     PWORK_ITEM WorkItem = ChewItem;\r
 \r
+    RemoveEntryList( &WorkItem->Entry );\r
+\r
     if( WorkItem->Worker ) \r
        WorkItem->Worker( WorkItem->UserSpace );\r
 \r
@@ -61,8 +62,10 @@ VOID STDCALL ChewWorkItem( PDEVICE_OBJECT DeviceObject, PVOID ChewItem ) {
 BOOLEAN ChewCreate\r
 ( PVOID *ItemPtr, UINT Bytes, VOID (*Worker)( PVOID ), PVOID UserSpace ) {\r
     PWORK_ITEM Item;\r
+    \r
     if( KeGetCurrentIrql() == PASSIVE_LEVEL ) {\r
-       *ItemPtr = NULL;\r
+       if( ItemPtr )\r
+           *ItemPtr = NULL;\r
        Worker(UserSpace);\r
        return TRUE;\r
     } else {\r
@@ -85,12 +88,14 @@ BOOLEAN ChewCreate
                ( &WorkQueue, &Item->Entry, &WorkQueueLock );\r
            IoQueueWorkItem\r
                ( Item->WorkItem, ChewWorkItem, CriticalWorkQueue, Item );\r
-\r
-           *ItemPtr = Item;\r
+           \r
+           if( ItemPtr ) \r
+               *ItemPtr = Item;\r
 \r
            return TRUE;\r
-       } else\r
+       } else {\r
            return FALSE;\r
+       }\r
     }\r
 }\r
 \r
index d87eb82..694d6dd 100644 (file)
@@ -1,10 +1,40 @@
+/*\r
+ * COPYRIGHT:       See COPYING in the top level directory\r
+ * PROJECT:         ReactOS kernel\r
+ * FILE:            include/chew/chew.h\r
+ * PURPOSE:         Common Highlevel Executive Worker\r
+ *\r
+ * PROGRAMMERS:     arty (ayerkes@speakeasy.net)\r
+ */\r
+\r
 #ifndef _REACTOS_CHEW_H\r
 #define _REACTOS_CHEW_H\r
 \r
+/**\r
+ * Initialize CHEW, given a device object (since IoAllocateWorkItem relies on\r
+ * it).\r
+ */\r
 VOID ChewInit( PDEVICE_OBJECT DeviceObject );\r
+/**\r
+ * Shutdown CHEW, including removing remaining work items.\r
+ */\r
 VOID ChewShutdown();\r
+/**\r
+ * Create a work item, or perform the work, based on IRQL.\r
+ * At passive level, Worker is called directly on UserSpace.\r
+ * At greater than passive level, a work item is created with Bytes\r
+ * context area and data copied from UserSpace.\r
+ * If a work item is created, Item contains the address and the function\r
+ * returns true.\r
+ * If the work is performed immediately, Item contains NULL and the\r
+ * function returns true.\r
+ * Else, the function returns false and Item is undefined.\r
+ */\r
 BOOLEAN ChewCreate\r
 ( PVOID *Item, UINT Bytes, VOID (*Worker)(PVOID), PVOID UserSpace );\r
+/**\r
+ * Remove a work item, given the pointer returned to Item in ChewCreate.\r
+ */\r
 VOID ChewRemove( PVOID Item );\r
 \r
 #endif/*_REACTOS_CHEW_H*/\r