[DAPL2] sync with WinOF 2.1 branch
[mirror/winof/.git] / inc / kernel / work_queue.h
1 /*\r
2  * Copyright (c) 2009 Intel Corporation. All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  */\r
29 \r
30 #pragma once\r
31 \r
32 #ifndef _WORK_QUEUE_H_\r
33 #define _WORK_QUEUE_H_\r
34 \r
35 #include <ntddk.h>\r
36 \r
37 // Allow overlaying across IRP.Tail.Overlay.DriverContext\r
38 typedef struct _WORK_ENTRY\r
39 {\r
40         LIST_ENTRY                      Entry;\r
41         void                            (*WorkHandler)(struct _WORK_ENTRY *Work);\r
42         void                            *Context;\r
43 \r
44 }       WORK_ENTRY;\r
45 \r
46 static void WorkEntryInit(WORK_ENTRY *pWork,\r
47                                                   void (*WorkHandler)(struct _WORK_ENTRY *Work), void *Context)\r
48 {\r
49         pWork->WorkHandler = WorkHandler;\r
50         pWork->Context = Context;\r
51 }\r
52 \r
53 #define WorkEntryFromIrp(pIrp) ((WORK_ENTRY *) (pIrp)->Tail.Overlay.DriverContext)\r
54 \r
55 struct _WORK_QUEUE_TASK;\r
56 \r
57 typedef struct _WORK_QUEUE\r
58 {\r
59         LIST_ENTRY                                      List;\r
60         KSPIN_LOCK                                      Lock;\r
61         int                                                     TaskCount;\r
62         struct _WORK_QUEUE_TASK         *TaskArray;     // TaskArray[0] is for internal use\r
63 \r
64 }       WORK_QUEUE;\r
65 \r
66 NTSTATUS WorkQueueInit(WORK_QUEUE *pWorkQueue, PDEVICE_OBJECT Device,\r
67                                            int TaskCount);\r
68 void WorkQueueDestroy(WORK_QUEUE *pWorkQueue);\r
69 void WorkQueueInsert(WORK_QUEUE *pWorkQueue, WORK_ENTRY *pWork);\r
70 \r
71 #endif // _WORK_QUEUE_H_\r