strip whitespace from end of lines
[reactos.git] / reactos / ntoskrnl / io / iowork.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/io/iowork.c
6 * PURPOSE: Manage IO system work queues
7 *
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
9 * Robert Dickenson (odin@pnc.com.au)
10 */
11
12 /* INCLUDES ******************************************************************/
13
14 #include <ntoskrnl.h>
15 #define NDEBUG
16 #include <internal/debug.h>
17
18 /* TYPES ********************************************************************/
19
20 typedef struct _IO_WORKITEM
21 {
22 WORK_QUEUE_ITEM Item;
23 PDEVICE_OBJECT DeviceObject;
24 PIO_WORKITEM_ROUTINE WorkerRoutine;
25 PVOID Context;
26 } IO_WORKITEM;
27
28 /* GLOBALS ******************************************************************/
29
30 #define TAG_IOWI TAG('I', 'O', 'W', 'I')
31
32 /* FUNCTIONS ****************************************************************/
33
34 VOID STATIC STDCALL
35 IoWorkItemCallback(PVOID Parameter)
36 {
37 PIO_WORKITEM IoWorkItem = (PIO_WORKITEM)Parameter;
38 PDEVICE_OBJECT DeviceObject = IoWorkItem->DeviceObject;
39 IoWorkItem->WorkerRoutine(IoWorkItem->DeviceObject, IoWorkItem->Context);
40 ObDereferenceObject(DeviceObject);
41 }
42
43 /*
44 * @implemented
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 /*
71 * @implemented
72 */
73 VOID STDCALL
74 IoFreeWorkItem(PIO_WORKITEM IoWorkItem)
75 {
76 ExFreePool(IoWorkItem);
77 }
78
79 /*
80 * @implemented
81 */
82 PIO_WORKITEM STDCALL
83 IoAllocateWorkItem(PDEVICE_OBJECT DeviceObject)
84 {
85 PIO_WORKITEM IoWorkItem = NULL;
86
87 IoWorkItem =
88 ExAllocatePoolWithTag(NonPagedPool, sizeof(IO_WORKITEM), TAG_IOWI);
89 if (IoWorkItem == NULL)
90 {
91 return(NULL);
92 }
93 RtlZeroMemory(IoWorkItem, sizeof(IO_WORKITEM));
94 IoWorkItem->DeviceObject = DeviceObject;
95 return(IoWorkItem);
96 }
97
98 /* EOF */