diff options
-rw-r--r-- | machine/atomic.h | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/machine/atomic.h b/machine/atomic.h index b23acae..fe81566 100644 --- a/machine/atomic.h +++ b/machine/atomic.h @@ -40,14 +40,20 @@ typedef struct { int lock; } spinlock_t; res; }) #endif +static inline int spinlock_trylock(spinlock_t* lock) +{ + int res = atomic_swap(&lock->lock, -1); + mb(); + return res; +} + static inline void spinlock_lock(spinlock_t* lock) { do { while (atomic_read(&lock->lock)) ; - } while (atomic_swap(&lock->lock, -1)); - mb(); + } while (spinlock_trylock(lock)); } static inline void spinlock_unlock(spinlock_t* lock) |