#ifndef __LIBC_ATOMIC_H #define __LIBC_ATOMIC_H #include #define LIBC_LOCK(__lock) __libc_lock(&__lock) #define LIBC_UNLOCK(__lock) atomic_flag_clear(&__lock) static __inline void __libc_lock(volatile atomic_flag *lock) { while (atomic_flag_test_and_set_explicit(lock, memory_order_acquire)) { unsigned int spins = 1; do { for (unsigned int i = 0; i < spins; i++) __asm__ volatile("pause"); if (spins < 64) spins *= 2; } while (atomic_flag_test_and_set_explicit( lock, memory_order_relaxed)); } } #endif