#include #include void spin_lock(struct spinlock* spin) { uint32_t my = atomic_fetch_add_explicit(&spin->next, 1, memory_order_relaxed); while (atomic_load_explicit(&spin->owner, memory_order_acquire) != my) { asm volatile("pause"); } } void spin_unlock(struct spinlock* spin) { uint32_t val = atomic_load_explicit(&spin->owner, memory_order_relaxed); atomic_store_explicit(&spin->owner, val + 1, memory_order_release); }