summaryrefslogtreecommitdiff
path: root/spinlock.c
diff options
context:
space:
mode:
authorrsc <rsc>2006-07-17 05:00:25 +0000
committerrsc <rsc>2006-07-17 05:00:25 +0000
commit0dd4253747eef56d0f1539fac7d62234f6af5f51 (patch)
tree1c28a6d0ce4cef90f85fd5f8b0106d431bfeffda /spinlock.c
parentb5f17007f41770fee97fa850635976ceb7aa7492 (diff)
downloadxv6-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.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/spinlock.c b/spinlock.c
index c0f236d..171afaf 100644
--- a/spinlock.c
+++ b/spinlock.c
@@ -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();
+}