- Fix formatting, comments.
- Delete an empty directory.

svn path=/trunk/; revision=43386
This commit is contained in:
Dmitry Gorbachev 2009-10-12 03:27:45 +00:00
parent ac4cdf694c
commit 27f05c27a8
4 changed files with 88 additions and 76 deletions

View file

@ -1,7 +1,7 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: include/chew/chew.h * FILE: include/reactos/chew/chew.h
* PURPOSE: Common Highlevel Executive Worker * PURPOSE: Common Highlevel Executive Worker
* *
* PROGRAMMERS: arty (ayerkes@speakeasy.net) * PROGRAMMERS: arty (ayerkes@speakeasy.net)
@ -14,15 +14,16 @@
* Initialize CHEW, given a device object (since IoAllocateWorkItem relies on * Initialize CHEW, given a device object (since IoAllocateWorkItem relies on
* it). * it).
*/ */
VOID ChewInit( PDEVICE_OBJECT DeviceObject ); VOID ChewInit(PDEVICE_OBJECT DeviceObject);
/** /**
* Shutdown CHEW, waits for remaining work items. * Shutdown CHEW, waits for remaining work items.
*/ */
VOID ChewShutdown(); VOID ChewShutdown(VOID);
/** /**
* Creates and queues a work item. * Creates and queues a work item.
*/ */
BOOLEAN ChewCreate BOOLEAN ChewCreate(VOID (*Worker)(PVOID), PVOID WorkerContext);
( VOID (*Worker)(PVOID), PVOID WorkerContext );
#endif/*_REACTOS_CHEW_H*/ #endif/*_REACTOS_CHEW_H*/

View file

@ -4,4 +4,4 @@
<define name="_NTOSKRNL_" /> <define name="_NTOSKRNL_" />
<include base="chew">include</include> <include base="chew">include</include>
<file>workqueue.c</file> <file>workqueue.c</file>
</module> </module>

View file

@ -1,82 +1,93 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS kernel
* FILE: drivers/lib/chew/workqueue.c * FILE: lib/drivers/chew/workqueue.c
* PURPOSE: Common Highlevel Executive Worker * PURPOSE: Common Highlevel Executive Worker
* *
* PROGRAMMERS: arty (ayerkes@speakeasy.net) * PROGRAMMERS: arty (ayerkes@speakeasy.net)
*/ */
#include <ntddk.h>
#include <chew/chew.h> #include <ntddk.h>
#include <chew/chew.h>
#define NDEBUG
#define NDEBUG
//#include <debug.h>
#define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z)) #define FOURCC(w,x,y,z) (((w) << 24) | ((x) << 16) | ((y) << 8) | (z))
#define CHEW_TAG FOURCC('C','H','E','W') #define CHEW_TAG FOURCC('C','H','E','W')
PDEVICE_OBJECT WorkQueueDevice; PDEVICE_OBJECT WorkQueueDevice;
LIST_ENTRY WorkQueue; LIST_ENTRY WorkQueue;
KSPIN_LOCK WorkQueueLock; KSPIN_LOCK WorkQueueLock;
KEVENT WorkQueueClear; KEVENT WorkQueueClear;
typedef struct _WORK_ITEM { typedef struct _WORK_ITEM
LIST_ENTRY Entry; {
PIO_WORKITEM WorkItem; LIST_ENTRY Entry;
VOID (*Worker)( PVOID WorkerContext ); PIO_WORKITEM WorkItem;
PVOID WorkerContext; VOID (*Worker)(PVOID WorkerContext);
} WORK_ITEM, *PWORK_ITEM; PVOID WorkerContext;
} WORK_ITEM, *PWORK_ITEM;
VOID ChewInit( PDEVICE_OBJECT DeviceObject ) {
WorkQueueDevice = DeviceObject; VOID ChewInit(PDEVICE_OBJECT DeviceObject)
InitializeListHead( &WorkQueue ); {
KeInitializeSpinLock( &WorkQueueLock ); WorkQueueDevice = DeviceObject;
KeInitializeEvent(&WorkQueueClear, NotificationEvent, TRUE); InitializeListHead(&WorkQueue);
} KeInitializeSpinLock(&WorkQueueLock);
KeInitializeEvent(&WorkQueueClear, NotificationEvent, TRUE);
VOID ChewShutdown() { }
KeWaitForSingleObject(&WorkQueueClear, Executive, KernelMode, FALSE, NULL);
} VOID ChewShutdown(VOID)
{
VOID NTAPI ChewWorkItem( PDEVICE_OBJECT DeviceObject, PVOID ChewItem ) { KeWaitForSingleObject(&WorkQueueClear, Executive, KernelMode, FALSE, NULL);
}
VOID NTAPI ChewWorkItem(PDEVICE_OBJECT DeviceObject, PVOID ChewItem)
{
PWORK_ITEM WorkItem = ChewItem; PWORK_ITEM WorkItem = ChewItem;
KIRQL OldIrql; KIRQL OldIrql;
WorkItem->Worker( WorkItem->WorkerContext ); WorkItem->Worker(WorkItem->WorkerContext);
IoFreeWorkItem( WorkItem->WorkItem ); IoFreeWorkItem(WorkItem->WorkItem);
KeAcquireSpinLock(&WorkQueueLock, &OldIrql); KeAcquireSpinLock(&WorkQueueLock, &OldIrql);
RemoveEntryList(&WorkItem->Entry); RemoveEntryList(&WorkItem->Entry);
if (IsListEmpty(&WorkQueue)) if (IsListEmpty(&WorkQueue))
KeSetEvent(&WorkQueueClear, 0, FALSE); KeSetEvent(&WorkQueueClear, 0, FALSE);
KeReleaseSpinLock(&WorkQueueLock, OldIrql); KeReleaseSpinLock(&WorkQueueLock, OldIrql);
ExFreePoolWithTag(WorkItem, CHEW_TAG); ExFreePoolWithTag(WorkItem, CHEW_TAG);
} }
BOOLEAN ChewCreate BOOLEAN ChewCreate(VOID (*Worker)(PVOID), PVOID WorkerContext)
( VOID (*Worker)( PVOID ), PVOID WorkerContext ) { {
PWORK_ITEM Item; PWORK_ITEM Item;
Item = ExAllocatePoolWithTag Item = ExAllocatePoolWithTag(NonPagedPool,
( NonPagedPool, sizeof(WORK_ITEM),
sizeof( WORK_ITEM ), CHEW_TAG);
CHEW_TAG );
if (Item)
if( Item ) { {
Item->WorkItem = IoAllocateWorkItem( WorkQueueDevice ); Item->WorkItem = IoAllocateWorkItem(WorkQueueDevice);
if( !Item->WorkItem ) { if (!Item->WorkItem)
ExFreePool( Item ); {
return FALSE; ExFreePool(Item);
} return FALSE;
Item->Worker = Worker; }
Item->WorkerContext = WorkerContext;
ExInterlockedInsertTailList( &WorkQueue, &Item->Entry, &WorkQueueLock ); Item->Worker = Worker;
KeResetEvent(&WorkQueueClear); Item->WorkerContext = WorkerContext;
IoQueueWorkItem( Item->WorkItem, ChewWorkItem, DelayedWorkQueue, Item ); ExInterlockedInsertTailList(&WorkQueue, &Item->Entry, &WorkQueueLock);
KeResetEvent(&WorkQueueClear);
return TRUE; IoQueueWorkItem(Item->WorkItem, ChewWorkItem, DelayedWorkQueue, Item);
} else {
return FALSE; return TRUE;
} }
} else
{
return FALSE;
}
}