aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--machine/atomic.h10
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)