#include #include #ifdef ARCH_X86_64 #define pause() asm volatile("pause") #else #error "Unsupported architecture" #endif void Spinlock::lock() { int expected = 0; while (!m_lock.compare_exchange_strong(expected, 1)) { expected = 0; pause(); } } bool Spinlock::try_lock() { int expected = 0; return m_lock.compare_exchange_strong(expected, 1); } void Spinlock::unlock() { int expected = 1; if (!m_lock.compare_exchange_strong(expected, 0)) { dbgln("Spinlock::unlock() called on an unlocked lock with value %d", expected); } } ScopeLock::ScopeLock(Spinlock& lock) : m_lock(lock) { m_lock.lock(); } ScopeLock::~ScopeLock() { if (!m_taken_over) m_lock.unlock(); } const u32 RETRIES = 5000000; SafeScopeLock::SafeScopeLock(Spinlock& lock) : m_lock(lock) { u32 tries_left = RETRIES; while (!lock.try_lock() && --tries_left) { pause(); } if (tries_left) m_success = true; } SafeScopeLock::~SafeScopeLock() { if (m_success) m_lock.unlock(); }