update for HEAD-2003091401
[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 /*
47  * @implemented
48  */
49 VOID STDCALL
50 IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, 
51                 IN PIO_WORKITEM_ROUTINE WorkerRoutine,
52                 IN WORK_QUEUE_TYPE QueueType, 
53                 IN PVOID Context)
54 /*
55  * FUNCTION: Inserts a work item in a queue for one of the system worker
56  * threads to process
57  * ARGUMENTS:
58  *        IoWorkItem = Item to insert
59  *        QueueType = Queue to insert it in
60  */
61 {
62   ExInitializeWorkItem(&IoWorkItem->Item, IoWorkItemCallback, 
63                        (PVOID)IoWorkItem);
64   IoWorkItem->WorkerRoutine = WorkerRoutine;
65   IoWorkItem->Context = Context;
66   ObReferenceObjectByPointer(IoWorkItem->DeviceObject,
67                              FILE_ALL_ACCESS,
68                              NULL,
69                              KernelMode);
70   ExQueueWorkItem(&IoWorkItem->Item, QueueType);
71 }
72
73 /*
74  * @implemented
75  */
76 VOID STDCALL
77 IoFreeWorkItem(PIO_WORKITEM IoWorkItem)
78 {
79   ExFreePool(IoWorkItem);
80 }
81
82 /*
83  * @implemented
84  */
85 PIO_WORKITEM STDCALL
86 IoAllocateWorkItem(PDEVICE_OBJECT DeviceObject)
87 {
88   PIO_WORKITEM IoWorkItem = NULL;
89   
90   IoWorkItem = 
91     ExAllocatePoolWithTag(NonPagedPool, sizeof(IO_WORKITEM), TAG_IOWI);
92   if (IoWorkItem == NULL)
93     {
94       return(NULL);
95     }
96   RtlZeroMemory(IoWorkItem, sizeof(IO_WORKITEM));
97   IoWorkItem->DeviceObject = DeviceObject;
98   return(IoWorkItem);
99 }
100
101 /* EOF */