#pragma once #include namespace fastsignals::detail { class spin_mutex { public: spin_mutex() = default; spin_mutex(const spin_mutex&) = delete; spin_mutex& operator=(const spin_mutex&) = delete; spin_mutex(spin_mutex&&) = delete; spin_mutex& operator=(spin_mutex&&) = delete; inline bool try_lock() noexcept { return !m_busy.test_and_set(std::memory_order_acquire); } inline void lock() noexcept { while (!try_lock()) { /* do nothing */; } } inline void unlock() noexcept { m_busy.clear(std::memory_order_release); } private: std::atomic_flag m_busy = ATOMIC_FLAG_INIT; }; } // namespace fastsignals::detail