16 lines
473 B
C
16 lines
473 B
C
#include <zinnia/spin.h>
|
|
#include <stdatomic.h>
|
|
|
|
void spin_lock(spinlock_t* 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(spinlock_t* spin) {
|
|
uint32_t val = atomic_load_explicit(&spin->owner, memory_order_relaxed);
|
|
atomic_store_explicit(&spin->owner, val + 1, memory_order_release);
|
|
}
|