diff --git a/include/metalsvm/spinlocks.h b/include/metalsvm/spinlocks.h index c6de10f3..e3d7e86b 100644 --- a/include/metalsvm/spinlocks.h +++ b/include/metalsvm/spinlocks.h @@ -35,39 +35,69 @@ typedef struct { #define SPINLOCK_INIT { 0 } -inline static void spinlock_init(spinlock_t* s) { +inline static int spinlock_init(spinlock_t* s) { + if (BUILTIN_EXPECT(!s, 0)) + return -1; + s->lock = 0; + + return 0; } -inline static void spinlock_destroy(spinlock_t* s) { +inline static int spinlock_destroy(spinlock_t* s) { + if (BUILTIN_EXPECT(!s, 0)) + return -1; + s->lock = 0; + + return 0; } inline static int spinlock_lock(spinlock_t* s) { + if (BUILTIN_EXPECT(!s, 0)) + return -1; + while (atomic_uint32_test_and_set(&(s->lock))) schedule(); + return 0; } inline static int spinlock_trylock(spinlock_t* s) { + if (BUILTIN_EXPECT(!s, 0)) + return -1; + return !atomic_uint32_test_and_set(&(s->lock)); } inline static int spinlock_unlock(spinlock_t* s) { - if (BUILTIN_EXPECT(!s->lock, 0)) + if (BUILTIN_EXPECT(!s, 0)) return -1; + if (BUILTIN_EXPECT(!(s->lock), 0)) + return -1; + s->lock = 0; + return 0; } inline static int spinlock_lock_irqsave(spinlock_t* s) { + if (BUILTIN_EXPECT(!s, 0)) + return -1; + irq_disable(); return spinlock_lock(s); } inline static int spinlock_unlock_irqsave(spinlock_t* s) { - int ret = spinlock_unlock(s); + int ret; + + if (BUILTIN_EXPECT(!s, 0)) + return -1; + + ret = spinlock_unlock(s); irq_enable(); + return ret; }