6 (NTAPI
*PRX_WORKERTHREAD_ROUTINE
) (
9 typedef struct _RX_WORK_QUEUE_ITEM_
12 PRDBSS_DEVICE_OBJECT pDeviceObject
;
13 } RX_WORK_QUEUE_ITEM
, *PRX_WORK_QUEUE_ITEM
;
15 typedef struct _RX_WORK_DISPATCH_ITEM_
17 RX_WORK_QUEUE_ITEM WorkQueueItem
;
18 PRX_WORKERTHREAD_ROUTINE DispatchRoutine
;
19 PVOID DispatchRoutineParameter
;
20 } RX_WORK_DISPATCH_ITEM
, *PRX_WORK_DISPATCH_ITEM
;
22 typedef enum _RX_WORK_QUEUE_STATE_
26 RxWorkQueueRundownInProgress
27 } RX_WORK_QUEUE_STATE
, *PRX_WORK_QUEUE_STATE
;
29 typedef struct _RX_WORK_QUEUE_RUNDOWN_CONTEXT_
31 KEVENT RundownCompletionEvent
;
32 LONG NumberOfThreadsSpunDown
;
33 PETHREAD
*ThreadPointers
;
34 } RX_WORK_QUEUE_RUNDOWN_CONTEXT
, *PRX_WORK_QUEUE_RUNDOWN_CONTEXT
;
36 typedef struct _RX_WORK_QUEUE_
39 BOOLEAN SpinUpRequestPending
;
42 PRX_WORK_QUEUE_RUNDOWN_CONTEXT pRundownContext
;
43 volatile LONG NumberOfWorkItemsDispatched
;
44 volatile LONG NumberOfWorkItemsToBeDispatched
;
45 LONG CumulativeQueueLength
;
46 LONG NumberOfSpinUpRequests
;
47 LONG MaximumNumberOfWorkerThreads
;
48 LONG MinimumNumberOfWorkerThreads
;
49 volatile LONG NumberOfActiveWorkerThreads
;
50 volatile LONG NumberOfIdleWorkerThreads
;
51 LONG NumberOfFailedSpinUpRequests
;
52 volatile LONG WorkQueueItemForSpinUpWorkerThreadInUse
;
53 RX_WORK_QUEUE_ITEM WorkQueueItemForTearDownWorkQueue
;
54 RX_WORK_QUEUE_ITEM WorkQueueItemForSpinUpWorkerThread
;
55 RX_WORK_QUEUE_ITEM WorkQueueItemForSpinDownWorkerThread
;
57 PETHREAD
*ThreadPointers
;
58 } RX_WORK_QUEUE
, *PRX_WORK_QUEUE
;
60 typedef struct _RX_WORK_QUEUE_DISPATCHER_
62 RX_WORK_QUEUE WorkQueue
[RxMaximumWorkQueue
];
63 } RX_WORK_QUEUE_DISPATCHER
, *PRX_WORK_QUEUE_DISPATCHER
;
65 typedef enum _RX_DISPATCHER_STATE_
69 } RX_DISPATCHER_STATE
, *PRX_DISPATCHER_STATE
;
71 typedef struct _RX_DISPATCHER_
73 LONG NumberOfProcessors
;
74 PEPROCESS OwnerProcess
;
75 PRX_WORK_QUEUE_DISPATCHER pWorkQueueDispatcher
;
76 RX_DISPATCHER_STATE State
;
77 LIST_ENTRY SpinUpRequests
;
78 KSPIN_LOCK SpinUpRequestsLock
;
79 KEVENT SpinUpRequestsEvent
;
80 KEVENT SpinUpRequestsTearDownEvent
;
81 } RX_DISPATCHER
, *PRX_DISPATCHER
;
86 _In_ PRDBSS_DEVICE_OBJECT pMRxDeviceObject
,
87 _In_ WORK_QUEUE_TYPE WorkQueueType
,
88 _In_ PRX_WORK_QUEUE_ITEM pWorkQueueItem
,
89 _In_ PRX_WORKERTHREAD_ROUTINE Routine
,
94 RxDispatchToWorkerThread(
95 _In_ PRDBSS_DEVICE_OBJECT pMRxDeviceObject
,
96 _In_ WORK_QUEUE_TYPE WorkQueueType
,
97 _In_ PRX_WORKERTHREAD_ROUTINE Routine
,
102 RxInitializeDispatcher(
106 RxInitializeMRxDispatcher(
107 _Inout_ PRDBSS_DEVICE_OBJECT pMRxDeviceObject
);