summaryrefslogtreecommitdiff
path: root/spinlock.c
diff options
context:
space:
mode:
Diffstat (limited to 'spinlock.c')
-rw-r--r--spinlock.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/spinlock.c b/spinlock.c
index bf863ef..7b372ef 100644
--- a/spinlock.c
+++ b/spinlock.c
@@ -59,8 +59,10 @@ release(struct spinlock *lk)
// stores; __sync_synchronize() tells them both to not re-order.
__sync_synchronize();
- // Release the lock.
- lk->locked = 0;
+ // Release the lock, equivalent to lk->locked = 0.
+ // This code can't use a C assignment, since it might
+ // not be atomic.
+ asm volatile("movl $0, %0" : "+m" (lk->locked) : );
popcli();
}