]> Devi Nivas Git - cs3210-lab1.git/commitdiff
sleeplock files
authorFrans Kaashoek <kaashoek@mit.edu>
Mon, 12 Sep 2016 01:01:24 +0000 (21:01 -0400)
committerFrans Kaashoek <kaashoek@mit.edu>
Mon, 12 Sep 2016 01:01:24 +0000 (21:01 -0400)
sleeplock.c [new file with mode: 0644]
sleeplock.h [new file with mode: 0644]

diff --git a/sleeplock.c b/sleeplock.c
new file mode 100644 (file)
index 0000000..2ded78d
--- /dev/null
@@ -0,0 +1,56 @@
+// Sleeping locks
+
+#include "types.h"
+#include "defs.h"
+#include "param.h"
+#include "x86.h"
+#include "memlayout.h"
+#include "mmu.h"
+#include "proc.h"
+#include "spinlock.h"
+#include "sleeplock.h"
+
+void
+initsleeplock(struct sleeplock *lk, char *name)
+{
+  initlock(&lk->lk, "sleep lock");
+  lk->name = name;
+  lk->locked = 0;
+  lk->pid = 0;
+}
+
+void
+acquiresleep(struct sleeplock *lk)
+{
+  acquire(&lk->lk);
+  while (lk->locked) {
+    sleep(lk, &lk->lk);
+  }
+  lk->locked = 1;
+  lk->pid = proc->pid;
+  release(&lk->lk);
+}
+
+void
+releasesleep(struct sleeplock *lk)
+{
+  acquire(&lk->lk);
+  lk->locked = 0;
+  lk->pid = 0;
+  wakeup(lk);
+  release(&lk->lk);
+}
+
+int
+holdingsleep(struct sleeplock *lk)
+{
+  int r;
+  
+  acquire(&lk->lk);
+  r = lk->locked;
+  release(&lk->lk);
+  return r;
+}
+
+
+
diff --git a/sleeplock.h b/sleeplock.h
new file mode 100644 (file)
index 0000000..110e6f3
--- /dev/null
@@ -0,0 +1,10 @@
+// Long-term locks for processes
+struct sleeplock {
+  uint locked;       // Is the lock held?
+  struct spinlock lk; // spinlock protecting this sleep lock
+  
+  // For debugging:
+  char *name;        // Name of lock.
+  int pid;           // Process holding lock
+};
+