45 lines
756 B
C++
45 lines
756 B
C++
#pragma once
|
|
#include "thread/Thread.h"
|
|
#include <luna/CircularQueue.h>
|
|
#include <luna/Spinlock.h>
|
|
|
|
class Mutex
|
|
{
|
|
public:
|
|
void lock();
|
|
void unlock();
|
|
bool try_lock();
|
|
|
|
private:
|
|
CircularQueue<Thread*, 32> m_blocked_threads;
|
|
Spinlock m_spinlock;
|
|
Atomic<pid_t> m_thread;
|
|
};
|
|
|
|
class ScopedMutexLock
|
|
{
|
|
public:
|
|
ScopedMutexLock(Mutex& lock) : m_lock(lock)
|
|
{
|
|
m_lock.lock();
|
|
}
|
|
|
|
~ScopedMutexLock()
|
|
{
|
|
if (!m_taken_over) m_lock.unlock();
|
|
}
|
|
|
|
ScopedMutexLock(const ScopedMutexLock&) = delete;
|
|
ScopedMutexLock(ScopedMutexLock&&) = delete;
|
|
|
|
Mutex& take_over()
|
|
{
|
|
m_taken_over = true;
|
|
return m_lock;
|
|
}
|
|
|
|
private:
|
|
Mutex& m_lock;
|
|
bool m_taken_over { false };
|
|
};
|