mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
272 lines
5.4 KiB
272 lines
5.4 KiB
/*++
|
|
|
|
Copyright (c) 1998-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
thrdpool.h
|
|
|
|
Abstract:
|
|
|
|
This module contains public declarations for the thread pool package.
|
|
|
|
Author:
|
|
|
|
Keith Moore (keithmo) 10-Jun-1998
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
|
|
#ifndef _THRDPOOL_H_
|
|
#define _THRDPOOL_H_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
//
|
|
// Thread tracker object. One of these objects is created for each
|
|
// thread in the pool. These are useful for (among other things)
|
|
// debugging.
|
|
//
|
|
|
|
typedef struct _UL_THREAD_TRACKER
|
|
{
|
|
//
|
|
// Links onto the per-thread-pool list.
|
|
//
|
|
|
|
LIST_ENTRY ThreadListEntry;
|
|
|
|
//
|
|
// The thread.
|
|
//
|
|
|
|
PETHREAD pThread;
|
|
|
|
|
|
} UL_THREAD_TRACKER, *PUL_THREAD_TRACKER;
|
|
|
|
|
|
//
|
|
// The thread pool object.
|
|
//
|
|
|
|
typedef struct _UL_THREAD_POOL
|
|
{
|
|
//
|
|
// List of worker items on this thread pool.
|
|
//
|
|
|
|
SLIST_HEADER WorkQueueSList;
|
|
|
|
//
|
|
// An event used to wakeup the thread from blocking state.
|
|
//
|
|
|
|
KEVENT WorkQueueEvent;
|
|
|
|
//
|
|
// List of threads.
|
|
//
|
|
|
|
LIST_ENTRY ThreadListHead;
|
|
|
|
//
|
|
// Pointer to the special thread designated as the IRP thread. The
|
|
// IRP thread is the first pool thread created and the last one to
|
|
// die. It is also the target for all asynchronous IRPs.
|
|
//
|
|
|
|
PETHREAD pIrpThread;
|
|
|
|
//
|
|
// A very infrequently used spinlock.
|
|
//
|
|
|
|
UL_SPIN_LOCK ThreadSpinLock;
|
|
|
|
//
|
|
// The thread handle returned from PsCreateSystemThread.
|
|
//
|
|
|
|
HANDLE ThreadHandle;
|
|
|
|
//
|
|
// The number of threads we created for this pool.
|
|
//
|
|
|
|
UCHAR ThreadCount;
|
|
|
|
//
|
|
// Flag used to indicate that this pool has been successfully
|
|
// initialized.
|
|
//
|
|
|
|
BOOLEAN Initialized;
|
|
|
|
//
|
|
// Target CPU for this pool. The worker threads use this to set
|
|
// their hard affinity.
|
|
//
|
|
|
|
UCHAR ThreadCpu;
|
|
|
|
} UL_THREAD_POOL, *PUL_THREAD_POOL;
|
|
|
|
|
|
//
|
|
// Necessary to ensure our array of UL_THREAD_POOL structures is
|
|
// cache aligned.
|
|
//
|
|
|
|
typedef union _UL_ALIGNED_THREAD_POOL
|
|
{
|
|
UL_THREAD_POOL ThreadPool;
|
|
|
|
UCHAR CacheAlignment[(sizeof(UL_THREAD_POOL) + UL_CACHE_LINE - 1) & ~(UL_CACHE_LINE - 1)];
|
|
|
|
} UL_ALIGNED_THREAD_POOL;
|
|
|
|
|
|
//
|
|
// Pointer to a thread pool worker function.
|
|
//
|
|
|
|
typedef union _UL_WORK_ITEM *PUL_WORK_ITEM;
|
|
|
|
typedef
|
|
VOID
|
|
(*PUL_WORK_ROUTINE)(
|
|
IN PUL_WORK_ITEM pWorkItem
|
|
);
|
|
|
|
|
|
//
|
|
// A work item. A work item may only appear on the work queue once.
|
|
//
|
|
|
|
typedef union _UL_WORK_ITEM
|
|
{
|
|
DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) ULONGLONG Alignment;
|
|
|
|
struct
|
|
{
|
|
SINGLE_LIST_ENTRY QueueListEntry;
|
|
PUL_WORK_ROUTINE pWorkRoutine;
|
|
};
|
|
|
|
} UL_WORK_ITEM, *PUL_WORK_ITEM;
|
|
|
|
|
|
//
|
|
//
|
|
// Macro to queue a preinitialized UL_WORK_ITEM.
|
|
//
|
|
|
|
__inline
|
|
VOID
|
|
FASTCALL
|
|
QUEUE_UL_WORK_ITEM(
|
|
PUL_THREAD_POOL pThreadPool,
|
|
IN PUL_WORK_ITEM pWorkItem
|
|
)
|
|
{
|
|
if (NULL == InterlockedPushEntrySList(
|
|
&pThreadPool->WorkQueueSList,
|
|
&pWorkItem->QueueListEntry
|
|
))
|
|
{
|
|
KeSetEvent(
|
|
&pThreadPool->WorkQueueEvent,
|
|
0,
|
|
FALSE
|
|
);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// Public functions.
|
|
//
|
|
|
|
NTSTATUS
|
|
UlInitializeThreadPool(
|
|
IN USHORT ThreadsPerCpu
|
|
);
|
|
|
|
VOID
|
|
UlTerminateThreadPool(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
UlQueueWorkItem(
|
|
IN PUL_WORK_ITEM pWorkItem,
|
|
IN PUL_WORK_ROUTINE pWorkRoutine
|
|
REFERENCE_DEBUG_FORMAL_PARAMS
|
|
);
|
|
|
|
#define UL_QUEUE_WORK_ITEM( pWorkItem, pWorkRoutine ) \
|
|
UlQueueWorkItem( \
|
|
pWorkItem, \
|
|
pWorkRoutine \
|
|
REFERENCE_DEBUG_ACTUAL_PARAMS \
|
|
)
|
|
|
|
#ifdef _WIN64
|
|
#define UL_WORK_ITEM_FROM_IRP( _irp ) \
|
|
(PUL_WORK_ITEM)&((_irp)->Tail.Overlay.DriverContext[1])
|
|
|
|
#define UL_WORK_ITEM_TO_IRP( _workItem ) \
|
|
CONTAINING_RECORD( (_workItem), IRP, Tail.Overlay.DriverContext[1])
|
|
#else
|
|
#define UL_WORK_ITEM_FROM_IRP( _irp ) \
|
|
(PUL_WORK_ITEM)&((_irp)->Tail.Overlay.DriverContext[0])
|
|
|
|
#define UL_WORK_ITEM_TO_IRP( _workItem ) \
|
|
CONTAINING_RECORD( (_workItem), IRP, Tail.Overlay.DriverContext[0])
|
|
#endif
|
|
|
|
VOID
|
|
UlQueueBlockingItem(
|
|
IN PUL_WORK_ITEM pWorkItem,
|
|
IN PUL_WORK_ROUTINE pWorkRoutine
|
|
REFERENCE_DEBUG_FORMAL_PARAMS
|
|
);
|
|
|
|
#define UL_QUEUE_BLOCKING_ITEM( pWorkItem, pWorkRoutine ) \
|
|
UlQueueBlockingItem( \
|
|
pWorkItem, \
|
|
pWorkRoutine \
|
|
REFERENCE_DEBUG_ACTUAL_PARAMS \
|
|
)
|
|
|
|
VOID
|
|
UlCallPassive(
|
|
IN PUL_WORK_ITEM pWorkItem,
|
|
IN PUL_WORK_ROUTINE pWorkRoutine
|
|
REFERENCE_DEBUG_FORMAL_PARAMS
|
|
);
|
|
|
|
#define UL_CALL_PASSIVE( pWorkItem, pWorkRoutine ) \
|
|
UlCallPassive( \
|
|
pWorkItem, \
|
|
pWorkRoutine \
|
|
REFERENCE_DEBUG_ACTUAL_PARAMS \
|
|
)
|
|
|
|
PETHREAD
|
|
UlQueryIrpThread(
|
|
VOID
|
|
);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}; // extern "C"
|
|
#endif
|
|
|
|
#endif // _THRDPOOL_H_
|