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