mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 10:14:44 +00:00
172 lines
3.2 KiB
C++
172 lines
3.2 KiB
C++
![]() |
/*++
|
||
|
|
||
|
Copyright (c) Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
FxCallbackSpinLock.hpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This is the C++ header for the FxCallbackSpinLock
|
||
|
|
||
|
This is the spinlock based driver callback lock
|
||
|
|
||
|
|
||
|
Author:
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _FXCALLBACKSPINLOCK_H_
|
||
|
#define _FXCALLBACKSPINLOCK_H_
|
||
|
|
||
|
extern "C" {
|
||
|
|
||
|
#if defined(EVENT_TRACING)
|
||
|
#include "FxCallbackSpinLock.hpp.tmh"
|
||
|
#endif
|
||
|
|
||
|
}
|
||
|
|
||
|
class FxCallbackSpinLock : public FxCallbackLock {
|
||
|
|
||
|
private:
|
||
|
MxLock m_Lock;
|
||
|
|
||
|
public:
|
||
|
|
||
|
FxCallbackSpinLock(
|
||
|
PFX_DRIVER_GLOBALS FxDriverGlobals
|
||
|
) :
|
||
|
FxCallbackLock(FxDriverGlobals)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
virtual
|
||
|
~FxCallbackSpinLock(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
if (m_Verifier) {
|
||
|
delete m_Verifier;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual
|
||
|
void
|
||
|
Initialize(
|
||
|
FxObject* ParentObject
|
||
|
)
|
||
|
{
|
||
|
PFX_DRIVER_GLOBALS fxDriverGlobals;
|
||
|
|
||
|
m_Verifier = NULL;
|
||
|
fxDriverGlobals = GetDriverGlobals();
|
||
|
|
||
|
if (fxDriverGlobals->FxVerifierLock) {
|
||
|
|
||
|
//
|
||
|
// VerifierLock CreateAndInitialize failure is not fatal,
|
||
|
// we just won't track anything
|
||
|
//
|
||
|
(void) FxVerifierLock::CreateAndInitialize(&m_Verifier,
|
||
|
fxDriverGlobals,
|
||
|
ParentObject,
|
||
|
FALSE);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual
|
||
|
void
|
||
|
Lock(
|
||
|
__out PKIRQL PreviousIrql
|
||
|
)
|
||
|
{
|
||
|
MxThread cur = Mx::MxGetCurrentThread();
|
||
|
|
||
|
if (m_OwnerThread == cur) {
|
||
|
PFX_DRIVER_GLOBALS fxDriverGlobals;
|
||
|
|
||
|
fxDriverGlobals = GetDriverGlobals();
|
||
|
m_RecursionCount++;
|
||
|
|
||
|
//
|
||
|
// For now we have decided not to allow this.
|
||
|
//
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
DoTraceLevelMessage(fxDriverGlobals, TRACE_LEVEL_FATAL, TRACINGDEVICE,
|
||
|
"Recursive acquire of callback lock! 0x%p", this);
|
||
|
|
||
|
FxVerifierBugCheck(fxDriverGlobals,
|
||
|
WDF_RECURSIVE_LOCK,
|
||
|
(ULONG_PTR) this);
|
||
|
return;
|
||
|
}
|
||
|
else {
|
||
|
if (m_Verifier != NULL) {
|
||
|
m_Verifier->Lock(PreviousIrql, FALSE);
|
||
|
}
|
||
|
else {
|
||
|
m_Lock.Acquire(PreviousIrql);
|
||
|
}
|
||
|
|
||
|
m_OwnerThread = cur;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
virtual
|
||
|
void
|
||
|
Unlock(
|
||
|
__in KIRQL PreviousIrql
|
||
|
)
|
||
|
{
|
||
|
CheckOwnership();
|
||
|
|
||
|
if (m_RecursionCount > 0) {
|
||
|
m_RecursionCount--;
|
||
|
}
|
||
|
else {
|
||
|
m_OwnerThread = NULL;
|
||
|
if (m_Verifier != NULL) {
|
||
|
m_Verifier->Unlock(PreviousIrql, FALSE);
|
||
|
}
|
||
|
else {
|
||
|
m_Lock.Release(PreviousIrql);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
_Must_inspect_result_
|
||
|
inline
|
||
|
virtual
|
||
|
BOOLEAN
|
||
|
IsOwner(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
MxThread cur = Mx::MxGetCurrentThread();
|
||
|
|
||
|
if (m_OwnerThread == cur) {
|
||
|
return TRUE;
|
||
|
}
|
||
|
else {
|
||
|
return FALSE;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#endif // _FXCALLBACKSPINLOCK_H_
|