summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2016-09-11 21:01:24 -0400
committerFrans Kaashoek <[email protected]>2016-09-11 21:01:24 -0400
commit564a1cf0cb867f7738fcbe466aec02081a16d3ab (patch)
treedd1870a799419d7c01678e8856caadec442357bc
parentdec637bc59a23a7676f2ec0c9db10fe8122607df (diff)
downloadxv6-labs-564a1cf0cb867f7738fcbe466aec02081a16d3ab.tar.gz
xv6-labs-564a1cf0cb867f7738fcbe466aec02081a16d3ab.tar.bz2
xv6-labs-564a1cf0cb867f7738fcbe466aec02081a16d3ab.zip
sleeplock files
-rw-r--r--sleeplock.c56
-rw-r--r--sleeplock.h10
2 files changed, 66 insertions, 0 deletions
diff --git a/sleeplock.c b/sleeplock.c
new file mode 100644
index 0000000..2ded78d
--- /dev/null
+++ b/sleeplock.c
@@ -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
index 0000000..110e6f3
--- /dev/null
+++ b/sleeplock.h
@@ -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
+};
+