#ifndef APOS_LOCK_H #define APOS_LOCK_H /** * @file lock.h * Atomic locks, currently only \ref spin_lock and \ref spin_unlock. Mutex is * probably overkill for this project. */ #include #include typedef atomic_int spinlock_t; #include static inline void spin_lock(spinlock_t *lck) { disable_irq(); do { while (atomic_load_explicit(lck, memory_order_acquire)) optional_pause(); } while (atomic_exchange_explicit(lck, 1, memory_order_acq_rel)); } static inline void spin_unlock(spinlock_t *lck) { atomic_store_explicit(lck, 0, memory_order_release); enable_irq(); } #endif /* APOS_LOCK_H */