diff options
author | rsc <rsc> | 2006-07-17 05:00:25 +0000 |
---|---|---|
committer | rsc <rsc> | 2006-07-17 05:00:25 +0000 |
commit | 0dd4253747eef56d0f1539fac7d62234f6af5f51 (patch) | |
tree | 1c28a6d0ce4cef90f85fd5f8b0106d431bfeffda /spinlock.c | |
parent | b5f17007f41770fee97fa850635976ceb7aa7492 (diff) | |
download | xv6-labs-0dd4253747eef56d0f1539fac7d62234f6af5f51.tar.gz xv6-labs-0dd4253747eef56d0f1539fac7d62234f6af5f51.tar.bz2 xv6-labs-0dd4253747eef56d0f1539fac7d62234f6af5f51.zip |
add ide_lock for sleep
Diffstat (limited to 'spinlock.c')
-rw-r--r-- | spinlock.c | 14 |
1 files changed, 13 insertions, 1 deletions
@@ -21,20 +21,32 @@ getcallerpc(void *v) void acquire(struct spinlock * lock) { + if(holding(lock)) + panic("acquire"); + if(cpus[cpu()].nlock++ == 0) cli(); while(cmpxchg(0, 1, &lock->locked) == 1) ; cpuid(0, 0, 0, 0, 0); // memory barrier - lock->locker_pc = getcallerpc(&lock); + lock->pc = getcallerpc(&lock); + lock->cpu = cpu(); } void release(struct spinlock * lock) { + if(!holding(lock)) + panic("release"); + cpuid(0, 0, 0, 0, 0); // memory barrier lock->locked = 0; if(--cpus[cpu()].nlock == 0) sti(); } +int +holding(struct spinlock *lock) +{ + return lock->locked && lock->cpu == cpu(); +} |