ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

workqueue.c
Go to the documentation of this file.
00001 /*
00002  * COPYRIGHT:       See COPYING in the top level directory
00003  * PROJECT:         ReactOS kernel
00004  * FILE:            lib/drivers/chew/workqueue.c
00005  * PURPOSE:         Common Highlevel Executive Worker
00006  *
00007  * PROGRAMMERS:     arty (ayerkes@speakeasy.net)
00008  */
00009 
00010 #include <ntddk.h>
00011 #include <chew/chew.h>
00012 
00013 #define NDEBUG
00014 //#include <debug.h>
00015 
00016 #define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z))
00017 #define CHEW_TAG FOURCC('C','H','E','W')
00018 
00019 PDEVICE_OBJECT WorkQueueDevice;
00020 LIST_ENTRY     WorkQueue;
00021 KSPIN_LOCK     WorkQueueLock;
00022 KEVENT         WorkQueueClear;
00023 
00024 typedef struct _WORK_ITEM
00025 {
00026     LIST_ENTRY Entry;
00027     PIO_WORKITEM WorkItem;
00028     VOID (*Worker)(PVOID WorkerContext);
00029     PVOID WorkerContext;
00030 } WORK_ITEM, *PWORK_ITEM;
00031 
00032 VOID ChewInit(PDEVICE_OBJECT DeviceObject)
00033 {
00034     WorkQueueDevice = DeviceObject;
00035     InitializeListHead(&WorkQueue);
00036     KeInitializeSpinLock(&WorkQueueLock);
00037     KeInitializeEvent(&WorkQueueClear, NotificationEvent, TRUE);
00038 }
00039 
00040 VOID ChewShutdown(VOID)
00041 {
00042     KeWaitForSingleObject(&WorkQueueClear, Executive, KernelMode, FALSE, NULL);
00043 }
00044 
00045 VOID NTAPI ChewWorkItem(PDEVICE_OBJECT DeviceObject, PVOID ChewItem)
00046 {
00047     PWORK_ITEM WorkItem = ChewItem;
00048     KIRQL OldIrql;
00049 
00050     WorkItem->Worker(WorkItem->WorkerContext);
00051 
00052     IoFreeWorkItem(WorkItem->WorkItem);
00053 
00054     KeAcquireSpinLock(&WorkQueueLock, &OldIrql);
00055     RemoveEntryList(&WorkItem->Entry);
00056 
00057     if (IsListEmpty(&WorkQueue))
00058         KeSetEvent(&WorkQueueClear, 0, FALSE);
00059 
00060     KeReleaseSpinLock(&WorkQueueLock, OldIrql);
00061 
00062     ExFreePoolWithTag(WorkItem, CHEW_TAG);
00063 }
00064 
00065 BOOLEAN ChewCreate(VOID (*Worker)(PVOID), PVOID WorkerContext)
00066 {
00067     PWORK_ITEM Item;
00068     Item = ExAllocatePoolWithTag(NonPagedPool, 
00069                                  sizeof(WORK_ITEM),
00070                                  CHEW_TAG);
00071 
00072     if (Item)
00073     {
00074         Item->WorkItem = IoAllocateWorkItem(WorkQueueDevice);
00075         if (!Item->WorkItem)
00076         {
00077             ExFreePool(Item);
00078             return FALSE;
00079         }
00080 
00081         Item->Worker = Worker;
00082         Item->WorkerContext = WorkerContext;
00083         ExInterlockedInsertTailList(&WorkQueue, &Item->Entry, &WorkQueueLock);
00084         KeResetEvent(&WorkQueueClear);
00085         IoQueueWorkItem(Item->WorkItem, ChewWorkItem, DelayedWorkQueue, Item);
00086 
00087         return TRUE;
00088     }
00089     else
00090     {
00091         return FALSE;
00092     }
00093 }

Generated on Fri May 25 2012 04:34:29 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.