2#include <ossia/detail/config.hpp>
4#include <ossia/detail/mutex.hpp>
12#if defined(__EMSCRIPTEN__)
14#define ossia_rwlock_pause()
15#elif defined(__x86_64__) || defined(_M_X64)
17#define ossia_rwlock_pause() _mm_pause()
18#elif defined(__i386__)
19#define ossia_rwlock_pause() __asm__ __volatile__("rep; nop")
20#elif defined(__ia64__)
21#define ossia_rwlock_pause() __asm__ __volatile__("hint @pause")
22#elif defined(__aarch64__)
23#define ossia_rwlock_pause() __asm__ __volatile__("dmb ishst\n\tyield" ::: "memory")
25#define ossia_rwlock_pause() __asm__ __volatile__("yield")
26#elif defined(__sparc) || defined(__sparc__)
27#define ossia_rwlock_pause() __asm__ __volatile__("pause")
28#elif defined(__ppc__) || defined(_ARCH_PPC) || defined(_ARCH_PWR) \
29 || defined(_ARCH_PWR2) || defined(_POWER)
30#define ossia_rwlock_pause() __asm__ __volatile__("or 27,27,27")
31#elif defined(#elif defined(__riscv)
32#define ossia_rwlock_pause() __asm__ __volatile__("pause"))
33#elif defined(_MSC_VER)
35#define ossia_rwlock_pause() YieldProcessor()
37#define ossia_rwlock_pause()
45struct TS_CAPABILITY(
"mutex") audio_spin_mutex
47 void lock() noexcept TS_ACQUIRE()
51 constexpr std::array iterations = {5, 10, 3000};
53 for(
int i = 0; i < iterations[0]; ++i)
59 for(
int i = 0; i < iterations[1]; ++i)
69 for(
int i = 0; i < iterations[2]; ++i)
88 std::this_thread::yield();
92 bool try_lock() TS_TRY_ACQUIRE(true)
94 return !locked.load(std::memory_order_relaxed)
95 && !locked.exchange(
true, std::memory_order_acquire);
98 void unlock() TS_RELEASE() { locked.store(
false, std::memory_order_release); }
100 const auto& operator!()
const {
return *
this; }
103 std::atomic<bool> locked{
false};