From ca60b47209635b7ac8316aeadb208e907f5b8b32 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 1 Sep 2025 22:24:15 -0300 Subject: [PATCH] spinlock: spin non atomically while waiting for lock to be released --- kernel-src/include/spinlock.h | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/kernel-src/include/spinlock.h b/kernel-src/include/spinlock.h index 5990d456..3420f50d 100644 --- a/kernel-src/include/spinlock.h +++ b/kernel-src/include/spinlock.h @@ -10,25 +10,27 @@ typedef int spinlock_t; #define SPINLOCK_INIT(x) x = SPINLOCK_INIT_VALUE #define SPINLOCK_DEFINE(x) spinlock_t x = SPINLOCK_INIT_VALUE -static inline void spinlock_acquire(spinlock_t *lock){ - while(!__sync_bool_compare_and_swap(lock, 0, 1)) asm("pause"); +static inline bool spinlock_try(spinlock_t *lock) { + return __sync_bool_compare_and_swap(lock, 0, 1); } -static inline bool spinlock_acquire_irq_clear(spinlock_t *lock){ +static inline void spinlock_acquire(spinlock_t *lock) { + while (!__sync_bool_compare_and_swap(lock, 0, 1)) { + while (*lock) asm volatile ("pause" : : : "memory"); + } +} + +static inline bool spinlock_acquire_irq_clear(spinlock_t *lock) { bool ret = interrupt_set(false); spinlock_acquire(lock); return ret; } -static inline bool spinlock_try(spinlock_t *lock){ - return __sync_bool_compare_and_swap(lock, 0, 1); -} - -static inline void spinlock_release(spinlock_t *lock){ +static inline void spinlock_release(spinlock_t *lock) { *lock = 0; } -static inline void spinlock_release_irq_restore(spinlock_t *lock, bool irqstate){ +static inline void spinlock_release_irq_restore(spinlock_t *lock, bool irqstate) { spinlock_release(lock); interrupt_set(irqstate); }