branch update for HEAD-2003050101
[reactos.git] / ntoskrnl / io / iowork.c
1 /* $Id$
2  *
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)
9  * REVISION HISTORY:
10  *       28/09/2002:   (RDD) Created from copy of ex/work.c
11  */
12
13 /* INCLUDES ******************************************************************/
14
15 #include <ddk/ntddk.h>
16 #include <internal/ps.h>
17
18 #define NDEBUG
19 #include <internal/debug.h>
20
21 /* TYPES ********************************************************************/
22
23 typedef struct _IO_WORKITEM
24 {
25   WORK_QUEUE_ITEM Item;
26   PDEVICE_OBJECT  DeviceObject;
27   PIO_WORKITEM_ROUTINE WorkerRoutine;
28   PVOID           Context;
29 } IO_WORKITEM;
30
31 /* GLOBALS ******************************************************************/
32
33 #define TAG_IOWI TAG('I', 'O', 'W', 'I')
34
35 /* FUNCTIONS ****************************************************************/
36
37 VOID STDCALL STATIC
38 IoWorkItemCallback(PVOID Parameter)
39 {
40   PIO_WORKITEM IoWorkItem = (PIO_WORKITEM)Parameter;
41   PDEVICE_OBJECT DeviceObject = IoWorkItem->DeviceObject;
42   IoWorkItem->WorkerRoutine(IoWorkItem->DeviceObject, IoWorkItem->Context);
43   ObDereferenceObject(DeviceObject);
44 }
45
46 VOID STDCALL
47 IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, 
48                 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
49                 IN WORK_QUEUE_TYPE QueueType, 
50                 IN PVOID Context)
51 /*
52  * FUNCTION: Inserts a work item in a queue for one of the system worker
53  * threads to process
54  * ARGUMENTS:
55  *        IoWorkItem = Item to insert
56  *        QueueType = Queue to insert it in
57  */
58 {
59   ExInitializeWorkItem(&IoWorkItem->Item, IoWorkItemCallback, 
60                        (PVOID)IoWorkItem);
61   IoWorkItem->WorkerRoutine = WorkerRoutine;
62   IoWorkItem->Context = Context;
63   ObReferenceObjectByPointer(IoWorkItem->DeviceObject,
64                              FILE_ALL_ACCESS,
65                              NULL,
66                              KernelMode);
67   ExQueueWorkItem(&IoWorkItem->Item, QueueType);
68 }
69
70 VOID STDCALL
71 IoFreeWorkItem(PIO_WORKITEM IoWorkItem)
72 {
73   ExFreePool(IoWorkItem);
74 }
75
76 PIO_WORKITEM STDCALL
77 IoAllocateWorkItem(PDEVICE_OBJECT DeviceObject)
78 {
79   PIO_WORKITEM IoWorkItem = NULL;
80   
81   IoWorkItem = 
82     ExAllocatePoolWithTag(NonPagedPool, sizeof(IO_WORKITEM), TAG_IOWI);
83   if (IoWorkItem == NULL)
84     {
85       return(NULL);
86     }
87   RtlZeroMemory(IoWorkItem, sizeof(IO_WORKITEM));
88   IoWorkItem->DeviceObject = DeviceObject;
89   return(IoWorkItem);
90 }
91
92 /* EOF */