mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 18:24:02 +00:00
196 lines
3.1 KiB
C++
196 lines
3.1 KiB
C++
![]() |
/*++
|
||
|
|
||
|
Copyright (c) Microsoft. All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
FxInterruptThreadpoolUm.hpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This file contains the class definition for the threadpool for interrupt object.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User mode only
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
|
||
|
--*/
|
||
|
#pragma once
|
||
|
|
||
|
#define MINIMUM_THREAD_COUNT_DEFAULT (1)
|
||
|
class FxInterrupt;
|
||
|
|
||
|
class FxInterruptThreadpool : FxGlobalsStump
|
||
|
{
|
||
|
|
||
|
private:
|
||
|
|
||
|
//
|
||
|
// Pointer to structure representing thread pool
|
||
|
//
|
||
|
PTP_POOL m_Pool;
|
||
|
|
||
|
//
|
||
|
// Structure representing callback environment for thread pool
|
||
|
//
|
||
|
TP_CALLBACK_ENVIRON m_CallbackEnvironment;
|
||
|
|
||
|
//
|
||
|
// Minimum thread pool thread count
|
||
|
//
|
||
|
ULONG m_MinimumThreadCount;
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Initialize(
|
||
|
);
|
||
|
|
||
|
public:
|
||
|
|
||
|
FxInterruptThreadpool(
|
||
|
PFX_DRIVER_GLOBALS FxDriverGlobals
|
||
|
);
|
||
|
|
||
|
~FxInterruptThreadpool();
|
||
|
|
||
|
static
|
||
|
HRESULT
|
||
|
_CreateAndInit(
|
||
|
_In_ PFX_DRIVER_GLOBALS DriverGlobals,
|
||
|
_Out_ FxInterruptThreadpool** ppThreadpool
|
||
|
);
|
||
|
|
||
|
PTP_CALLBACK_ENVIRON
|
||
|
GetCallbackEnvironment(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
return &m_CallbackEnvironment;
|
||
|
}
|
||
|
|
||
|
PTP_WAIT
|
||
|
CreateThreadpoolWait(
|
||
|
__in PTP_WAIT_CALLBACK pfnwa,
|
||
|
__inout_opt PVOID Context
|
||
|
)
|
||
|
{
|
||
|
return ::CreateThreadpoolWait(pfnwa, Context, &m_CallbackEnvironment);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
UpdateThreadPoolThreadLimits(
|
||
|
_In_ ULONG InterruptCount
|
||
|
);
|
||
|
};
|
||
|
|
||
|
class FxInterruptWaitblock : FxGlobalsStump
|
||
|
{
|
||
|
|
||
|
private:
|
||
|
|
||
|
//
|
||
|
// threadpool wait block
|
||
|
//
|
||
|
PTP_WAIT m_Wait;
|
||
|
|
||
|
//
|
||
|
// auto reset event
|
||
|
//
|
||
|
HANDLE m_Event;
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Initialize(
|
||
|
__in FxInterruptThreadpool* Threadpool,
|
||
|
__in FxInterrupt* Interrupt,
|
||
|
__in PTP_WAIT_CALLBACK WaitCallback
|
||
|
);
|
||
|
|
||
|
public:
|
||
|
|
||
|
static
|
||
|
HRESULT
|
||
|
_CreateAndInit(
|
||
|
_In_ FxInterruptThreadpool* Threadpool,
|
||
|
_In_ FxInterrupt* Interrupt,
|
||
|
_In_ PTP_WAIT_CALLBACK WaitCallback,
|
||
|
_Out_ FxInterruptWaitblock** Waitblock
|
||
|
);
|
||
|
|
||
|
FxInterruptWaitblock(
|
||
|
PFX_DRIVER_GLOBALS FxDriverGlobals
|
||
|
) :
|
||
|
FxGlobalsStump(FxDriverGlobals),
|
||
|
m_Wait(NULL),
|
||
|
m_Event(NULL)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
~FxInterruptWaitblock();
|
||
|
|
||
|
VOID
|
||
|
CloseThreadpoolWait(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
::CloseThreadpoolWait(m_Wait);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
SetThreadpoolWait(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// associates event with wait block and queues it
|
||
|
// to thread pool queue.
|
||
|
//
|
||
|
::SetThreadpoolWait(m_Wait, m_Event, NULL);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ClearThreadpoolWait(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// Passing a NULL handle clears the wait
|
||
|
//
|
||
|
::SetThreadpoolWait(m_Wait, NULL, NULL);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
WaitForOutstandingCallbackToComplete(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
::WaitForThreadpoolWaitCallbacks(m_Wait, FALSE);
|
||
|
}
|
||
|
|
||
|
HANDLE
|
||
|
GetEventHandle(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
return m_Event;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ResetEvent(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
::ResetEvent(m_Event);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|