Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenworkqueue.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
1.7.6.1
|