summaryrefslogtreecommitdiff
path: root/network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h
diff options
context:
space:
mode:
Diffstat (limited to 'network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h')
-rw-r--r--network/netadaptercx/netvadapterlibrary/code/rtl/KPushLock.h106
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();
+ }
};