diff options
| author | Frans Kaashoek <kaashoek@mit.edu> | 2016-09-11 21:01:24 -0400 | 
|---|---|---|
| committer | Frans Kaashoek <kaashoek@mit.edu> | 2016-09-11 21:01:24 -0400 | 
| commit | 564a1cf0cb867f7738fcbe466aec02081a16d3ab (patch) | |
| tree | dd1870a799419d7c01678e8856caadec442357bc | |
| parent | dec637bc59a23a7676f2ec0c9db10fe8122607df (diff) | |
| download | xv6-labs-564a1cf0cb867f7738fcbe466aec02081a16d3ab.tar.gz xv6-labs-564a1cf0cb867f7738fcbe466aec02081a16d3ab.tar.bz2 xv6-labs-564a1cf0cb867f7738fcbe466aec02081a16d3ab.zip | |
sleeplock files
| -rw-r--r-- | sleeplock.c | 56 | ||||
| -rw-r--r-- | sleeplock.h | 10 | 
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 +}; + | 
