diff options
Diffstat (limited to 'network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h')
| -rw-r--r-- | network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h | 106 |
1 files changed, 96 insertions, 10 deletions
diff --git a/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h b/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h index 81c58071..c589866c 100644 --- a/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h +++ b/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h @@ -1,3 +1,4 @@ +// Copyright (C) Microsoft Corporation. All rights reserved. #pragma once @@ -5,6 +6,7 @@ #include <KCriticalRegion.h> typedef struct _KTHREAD *PKTHREAD; +// Copyright (C) Microsoft Corporation. All rights reserved. class KPushLockBase { @@ -14,21 +16,90 @@ public: KPushLockBase(KPushLockBase &) = delete; KPushLockBase & operator=(KPushLockBase &) = delete; - PAGED void AcquireShared(); + PAGED + void + KPushLockBase::AcquireShared() + { +#ifdef _KERNEL_MODE + ExAcquirePushLockShared(&m_Lock); +#else + AcquireSRWLockShared(&m_Lock); +#endif + } - PAGED void ReleaseShared(); + PAGED + void + KPushLockBase::ReleaseShared() + { +#ifdef _KERNEL_MODE + ExReleasePushLockShared(&m_Lock); +#else + ReleaseSRWLockShared(&m_Lock); +#endif + } - PAGED void AcquireExclusive(); + PAGED + void + KPushLockBase::AcquireExclusive() + { +#ifdef _KERNEL_MODE + ExAcquirePushLockExclusive(&m_Lock); +#if DBG + m_ExclusiveOwner = KeGetCurrentThread(); +#endif +#else + AcquireSRWLockExclusive(&m_Lock); +#endif - PAGED void ReleaseExclusive(); + } - PAGED void AssertLockHeld(); + PAGED + void + KPushLockBase::ReleaseExclusive() + { +#if DBG + m_ExclusiveOwner = nullptr; +#endif +#ifdef _KERNEL_MODE + ExReleasePushLockExclusive(&m_Lock); +#else + ReleaseSRWLockExclusive(&m_Lock); +#endif + } - PAGED void AssertLockNotHeld(); + PAGED + void + KPushLockBase::AssertLockHeld() + { +#ifdef _KERNEL_MODE + WIN_ASSERT(m_ExclusiveOwner == KeGetCurrentThread()); +#endif + } + + PAGED + void + KPushLockBase::AssertLockNotHeld() + { +#if DBG && defined(_KERNEL_MODE) + WIN_ASSERT(m_ExclusiveOwner != KeGetCurrentThread()); +#endif + } protected: - PAGED void InitializeInner(); + PAGED + void + KPushLockBase::InitializeInner() + { +#ifdef _KERNEL_MODE + ExInitializePushLock(&m_Lock); +#else + InitializeSRWLock(&m_Lock); +#endif +#if DBG + m_ExclusiveOwner = nullptr; +#endif + } private: @@ -47,15 +118,30 @@ class KPushLock : public KPushLockBase { public: - PAGED KPushLock() noexcept; + PAGED + KPushLock::KPushLock() noexcept + { + InitializeInner(); + } + + - PAGED ~KPushLock(); + PAGED + KPushLock::~KPushLock() + { + AssertLockNotHeld(); + } }; class KPushLockManualConstruct : public KPushLockBase { public: - PAGED void Initialize(); + PAGED + void + KPushLockManualConstruct::Initialize() + { + InitializeInner(); + } }; |
