mirror of
https://github.com/reactos/reactos.git
synced 2024-09-28 21:44:31 +00:00
[NTOS] Introduce KiQueuedSpinLockGuard, similar to std::lock_guard for Queued Spin lock
And use it in Mm as MiPfnLockGuard
This commit is contained in:
parent
ffa7cfc1ff
commit
aeffd16b38
|
@ -1065,6 +1065,40 @@ KeBugCheckUnicodeToAnsi(
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|
||||||
|
namespace ntoskrnl
|
||||||
|
{
|
||||||
|
|
||||||
|
/* Like std::lock_guard, but for a Queued Spinlock */
|
||||||
|
template <KSPIN_LOCK_QUEUE_NUMBER n>
|
||||||
|
class KiQueuedSpinLockGuard
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
KIRQL m_OldIrql;
|
||||||
|
public:
|
||||||
|
|
||||||
|
_Requires_lock_not_held_(n)
|
||||||
|
_Acquires_lock_(n)
|
||||||
|
_IRQL_raises_(DISPATCH_LEVEL)
|
||||||
|
explicit KiQueuedSpinLockGuard()
|
||||||
|
{
|
||||||
|
m_OldIrql = KeAcquireQueuedSpinLock(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
_Requires_lock_held_(n)
|
||||||
|
_Releases_lock_(n)
|
||||||
|
~KiQueuedSpinLockGuard()
|
||||||
|
{
|
||||||
|
KeReleaseQueuedSpinLock(n, m_OldIrql);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
KiQueuedSpinLockGuard(KiQueuedSpinLockGuard const&) = delete;
|
||||||
|
KiQueuedSpinLockGuard& operator=(KiQueuedSpinLockGuard const&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "ke_x.h"
|
#include "ke_x.h"
|
||||||
|
|
|
@ -1676,4 +1676,10 @@ MiInitializeWorkingSetList(_Inout_ PMMSUPPORT WorkingSet);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|
||||||
|
namespace ntoskrnl
|
||||||
|
{
|
||||||
|
using MiPfnLockGuard = const KiQueuedSpinLockGuard<LockQueuePfnLock>;
|
||||||
|
} // namespace ntoskrnl
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue