Add conditional acquisition parameter to RAII guard classes
This commit is contained in:
@@ -19,17 +19,26 @@ namespace KE
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
KSPIN_LOCK_QUEUE_LEVEL QueuedLockLevel;
|
KSPIN_LOCK_QUEUE_LEVEL QueuedLockLevel;
|
||||||
|
BOOLEAN Owned;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel)
|
QueuedSpinLockGuard(IN OUT KSPIN_LOCK_QUEUE_LEVEL LockLevel,
|
||||||
|
IN BOOLEAN Acquire = TRUE)
|
||||||
{
|
{
|
||||||
QueuedLockLevel = LockLevel;
|
QueuedLockLevel = LockLevel;
|
||||||
KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel);
|
Owned = Acquire;
|
||||||
|
if(Owned)
|
||||||
|
{
|
||||||
|
KE::SpinLock::AcquireQueuedSpinLock(QueuedLockLevel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~QueuedSpinLockGuard()
|
~QueuedSpinLockGuard()
|
||||||
{
|
{
|
||||||
KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel);
|
if(Owned)
|
||||||
|
{
|
||||||
|
KE::SpinLock::ReleaseQueuedSpinLock(QueuedLockLevel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QueuedSpinLockGuard(const QueuedSpinLockGuard&) = delete;
|
QueuedSpinLockGuard(const QueuedSpinLockGuard&) = delete;
|
||||||
@@ -40,17 +49,26 @@ namespace KE
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
PKSPIN_LOCK Lock;
|
PKSPIN_LOCK Lock;
|
||||||
|
BOOLEAN Owned;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock)
|
SpinLockGuard(IN OUT PKSPIN_LOCK SpinLock,
|
||||||
|
IN BOOLEAN Acquire = TRUE)
|
||||||
{
|
{
|
||||||
Lock = SpinLock;
|
Lock = SpinLock;
|
||||||
KE::SpinLock::AcquireSpinLock(Lock);
|
Owned = Acquire;
|
||||||
|
if(Owned)
|
||||||
|
{
|
||||||
|
KE::SpinLock::AcquireSpinLock(Lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~SpinLockGuard()
|
~SpinLockGuard()
|
||||||
{
|
{
|
||||||
KE::SpinLock::ReleaseSpinLock(Lock);
|
if(Owned)
|
||||||
|
{
|
||||||
|
KE::SpinLock::ReleaseSpinLock(Lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SpinLockGuard(const SpinLockGuard&) = delete;
|
SpinLockGuard(const SpinLockGuard&) = delete;
|
||||||
|
|||||||
@@ -27,17 +27,26 @@ namespace KE
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
KRUNLEVEL PreviousRunLevel;
|
KRUNLEVEL PreviousRunLevel;
|
||||||
|
BOOLEAN Switched;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LowerRunLevel(KRUNLEVEL RunLevel)
|
LowerRunLevel(IN KRUNLEVEL RunLevel,
|
||||||
|
IN BOOLEAN ChangeLevel = TRUE)
|
||||||
{
|
{
|
||||||
PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel();
|
PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel();
|
||||||
KE::RunLevel::LowerRunLevel(RunLevel);
|
Switched = ChangeLevel;
|
||||||
|
if(Switched)
|
||||||
|
{
|
||||||
|
KE::RunLevel::LowerRunLevel(RunLevel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~LowerRunLevel()
|
~LowerRunLevel()
|
||||||
{
|
{
|
||||||
KE::RunLevel::RaiseRunLevel(PreviousRunLevel);
|
if(Switched)
|
||||||
|
{
|
||||||
|
KE::RunLevel::RaiseRunLevel(PreviousRunLevel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LowerRunLevel(const LowerRunLevel&) = delete;
|
LowerRunLevel(const LowerRunLevel&) = delete;
|
||||||
@@ -48,17 +57,26 @@ namespace KE
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
KRUNLEVEL PreviousRunLevel;
|
KRUNLEVEL PreviousRunLevel;
|
||||||
|
BOOLEAN Switched;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RaiseRunLevel(KRUNLEVEL RunLevel)
|
RaiseRunLevel(IN KRUNLEVEL RunLevel,
|
||||||
|
IN BOOLEAN ChangeLevel = TRUE)
|
||||||
{
|
{
|
||||||
PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel();
|
PreviousRunLevel = KE::RunLevel::GetCurrentRunLevel();
|
||||||
KE::RunLevel::RaiseRunLevel(RunLevel);
|
Switched = ChangeLevel;
|
||||||
|
if(Switched)
|
||||||
|
{
|
||||||
|
KE::RunLevel::RaiseRunLevel(RunLevel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~RaiseRunLevel()
|
~RaiseRunLevel()
|
||||||
{
|
{
|
||||||
KE::RunLevel::LowerRunLevel(PreviousRunLevel);
|
if(Switched)
|
||||||
|
{
|
||||||
|
KE::RunLevel::LowerRunLevel(PreviousRunLevel);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RaiseRunLevel(const RaiseRunLevel&) = delete;
|
RaiseRunLevel(const RaiseRunLevel&) = delete;
|
||||||
|
|||||||
Reference in New Issue
Block a user