reactos/sdk/lib/drivers/wdf/shared/inc/private/common/fxcallbackspinlock.hpp

172 lines
3.2 KiB
C++
Raw Normal View History

/*++
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_