#pragma once #include "thread/Thread.h" #include #include class Mutex { public: void lock(); void unlock(); bool try_lock(); private: CircularQueue m_blocked_threads; Spinlock m_spinlock; Atomic 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 }; };