banan-os/kernel/include/kernel/Lock/LockGuard.h

59 lines
770 B
C
Raw Normal View History

2023-02-01 01:51:25 +02:00
#pragma once
#include <BAN/NoCopyMove.h>
#include <stdint.h>
2023-02-01 01:51:25 +02:00
namespace Kernel
{
template<typename Lock>
class LockGuard
{
2023-02-09 23:05:26 +02:00
BAN_NON_COPYABLE(LockGuard);
BAN_NON_MOVABLE(LockGuard);
2023-02-01 01:51:25 +02:00
public:
LockGuard(Lock& lock)
: m_lock(lock)
{
m_lock.lock();
2023-02-01 01:51:25 +02:00
}
~LockGuard()
{
m_lock.unlock();
}
2023-02-01 01:51:25 +02:00
private:
Lock& m_lock;
};
template<typename Lock>
class LockFreeGuard
{
BAN_NON_COPYABLE(LockFreeGuard);
BAN_NON_MOVABLE(LockFreeGuard);
public:
LockFreeGuard(Lock& lock)
: m_lock(lock)
, m_depth(lock.lock_depth())
{
for (uint32_t i = 0; i < m_depth; i++)
m_lock.unlock();
}
~LockFreeGuard()
{
for (uint32_t i = 0; i < m_depth; i++)
m_lock.lock();
}
private:
Lock& m_lock;
const uint32_t m_depth;
};
}