This source file includes following definitions.
- initsleeplock
- acquiresleep
- releasesleep
- holdingsleep
1
2
3 #include "types.h"
4 #include "riscv.h"
5 #include "defs.h"
6 #include "param.h"
7 #include "memlayout.h"
8 #include "spinlock.h"
9 #include "proc.h"
10 #include "sleeplock.h"
11
12 void
13 initsleeplock(struct sleeplock *lk, char *name)
14 {
15 initlock(&lk->lk, "sleep lock");
16 lk->name = name;
17 lk->locked = 0;
18 lk->pid = 0;
19 }
20
21 void
22 acquiresleep(struct sleeplock *lk)
23 {
24 acquire(&lk->lk);
25 while (lk->locked) {
26 sleep_prepare(lk);
27 release(&lk->lk);
28 sleep();
29 acquire(&lk->lk);
30 }
31 lk->locked = 1;
32 lk->pid = myproc()->pid;
33 release(&lk->lk);
34 }
35
36 void
37 releasesleep(struct sleeplock *lk)
38 {
39 acquire(&lk->lk);
40 lk->locked = 0;
41 lk->pid = 0;
42 wakeup(lk);
43 release(&lk->lk);
44 }
45
46 int
47 holdingsleep(struct sleeplock *lk)
48 {
49 int r;
50
51 acquire(&lk->lk);
52 r = lk->locked && (lk->pid == myproc()->pid);
53 release(&lk->lk);
54 return r;
55 }