3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: reactos/ntoskrnl/io/iowork.c
6 * PURPOSE: Manage IO system work queues
7 * PROGRAMMER: David Welch (welch@mcmail.com)
8 * Robert Dickenson (odin@pnc.com.au)
10 * 28/09/2002: (RDD) Created from copy of ex/work.c
13 /* INCLUDES ******************************************************************/
15 #include <ddk/ntddk.h>
16 #include <internal/ps.h>
19 #include <internal/debug.h>
21 /* TYPES ********************************************************************/
23 typedef struct _IO_WORKITEM
26 PDEVICE_OBJECT DeviceObject;
27 PIO_WORKITEM_ROUTINE WorkerRoutine;
31 /* GLOBALS ******************************************************************/
33 #define TAG_IOWI TAG('I', 'O', 'W', 'I')
35 /* FUNCTIONS ****************************************************************/
38 IoWorkItemCallback(PVOID Parameter)
40 PIO_WORKITEM IoWorkItem = (PIO_WORKITEM)Parameter;
41 PDEVICE_OBJECT DeviceObject = IoWorkItem->DeviceObject;
42 IoWorkItem->WorkerRoutine(IoWorkItem->DeviceObject, IoWorkItem->Context);
43 ObDereferenceObject(DeviceObject);
47 IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem,
48 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
49 IN WORK_QUEUE_TYPE QueueType,
52 * FUNCTION: Inserts a work item in a queue for one of the system worker
55 * IoWorkItem = Item to insert
56 * QueueType = Queue to insert it in
59 ExInitializeWorkItem(&IoWorkItem->Item, IoWorkItemCallback,
61 IoWorkItem->WorkerRoutine = WorkerRoutine;
62 IoWorkItem->Context = Context;
63 ObReferenceObjectByPointer(IoWorkItem->DeviceObject,
67 ExQueueWorkItem(&IoWorkItem->Item, QueueType);
71 IoFreeWorkItem(PIO_WORKITEM IoWorkItem)
73 ExFreePool(IoWorkItem);
77 IoAllocateWorkItem(PDEVICE_OBJECT DeviceObject)
79 PIO_WORKITEM IoWorkItem = NULL;
82 ExAllocatePoolWithTag(NonPagedPool, sizeof(IO_WORKITEM), TAG_IOWI);
83 if (IoWorkItem == NULL)
87 RtlZeroMemory(IoWorkItem, sizeof(IO_WORKITEM));
88 IoWorkItem->DeviceObject = DeviceObject;