diff options
author | rsc <rsc> | 2006-09-07 16:53:49 +0000 |
---|---|---|
committer | rsc <rsc> | 2006-09-07 16:53:49 +0000 |
commit | e7a5b3c5ee2d440892ab7e9bb98ad82efb25219f (patch) | |
tree | 55d1c20e3a0c7043987cddcc84119f28adb547bf | |
parent | 0b75a8e8bea4f4c8230daae8d81eda04c19e622c (diff) | |
download | xv6-labs-e7a5b3c5ee2d440892ab7e9bb98ad82efb25219f.tar.gz xv6-labs-e7a5b3c5ee2d440892ab7e9bb98ad82efb25219f.tar.bz2 xv6-labs-e7a5b3c5ee2d440892ab7e9bb98ad82efb25219f.zip |
comment memory barriers
-rw-r--r-- | spinlock.c | 9 |
1 files changed, 8 insertions, 1 deletions
@@ -50,6 +50,10 @@ acquire(struct spinlock *lock) while(cmpxchg(0, 1, &lock->locked) == 1) ; + + // Now that lock is acquired, make sure + // we wait for all pending writes from other + // processors. cpuid(0, 0, 0, 0, 0); // memory barrier // Record info about lock acquisition for debugging. @@ -64,13 +68,16 @@ acquire(struct spinlock *lock) void release(struct spinlock *lock) { - if(!holding(lock)) panic("release"); lock->pcs[0] = 0; lock->cpu = 0xffffffff; + + // Before unlocking the lock, make sure to flush + // any pending memory writes from this processor. cpuid(0, 0, 0, 0, 0); // memory barrier + lock->locked = 0; if(--cpus[cpu()].nlock == 0) sti(); |