finished applying @implemented and @unimplemented comments and remove the comments...
[reactos.git] / reactos / ntoskrnl / io / iowork.c
1 /* $Id: iowork.c,v 1.5 2003/07/11 01:23:14 royce Exp $
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 */