You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
797 B
55 lines
797 B
// Sleeping locks |
|
|
|
#include "types.h" |
|
#include "riscv.h" |
|
#include "defs.h" |
|
#include "param.h" |
|
#include "memlayout.h" |
|
#include "spinlock.h" |
|
#include "proc.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 = myproc()->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 && (lk->pid == myproc()->pid); |
|
release(&lk->lk); |
|
return r; |
|
} |
|
|
|
|
|
|
|
|