xref: /xv6-public/sleeplock.c (revision 0b86d037)
1564a1cf0SFrans Kaashoek // Sleeping locks
2564a1cf0SFrans Kaashoek 
3564a1cf0SFrans Kaashoek #include "types.h"
4564a1cf0SFrans Kaashoek #include "defs.h"
5564a1cf0SFrans Kaashoek #include "param.h"
6564a1cf0SFrans Kaashoek #include "x86.h"
7564a1cf0SFrans Kaashoek #include "memlayout.h"
8564a1cf0SFrans Kaashoek #include "mmu.h"
9564a1cf0SFrans Kaashoek #include "proc.h"
10564a1cf0SFrans Kaashoek #include "spinlock.h"
11564a1cf0SFrans Kaashoek #include "sleeplock.h"
12564a1cf0SFrans Kaashoek 
13564a1cf0SFrans Kaashoek void
initsleeplock(struct sleeplock * lk,char * name)14564a1cf0SFrans Kaashoek initsleeplock(struct sleeplock *lk, char *name)
15564a1cf0SFrans Kaashoek {
16564a1cf0SFrans Kaashoek   initlock(&lk->lk, "sleep lock");
17564a1cf0SFrans Kaashoek   lk->name = name;
18564a1cf0SFrans Kaashoek   lk->locked = 0;
19564a1cf0SFrans Kaashoek   lk->pid = 0;
20564a1cf0SFrans Kaashoek }
21564a1cf0SFrans Kaashoek 
22564a1cf0SFrans Kaashoek void
acquiresleep(struct sleeplock * lk)23564a1cf0SFrans Kaashoek acquiresleep(struct sleeplock *lk)
24564a1cf0SFrans Kaashoek {
25564a1cf0SFrans Kaashoek   acquire(&lk->lk);
26564a1cf0SFrans Kaashoek   while (lk->locked) {
27564a1cf0SFrans Kaashoek     sleep(lk, &lk->lk);
28564a1cf0SFrans Kaashoek   }
29564a1cf0SFrans Kaashoek   lk->locked = 1;
30abf847a0SFrans Kaashoek   lk->pid = myproc()->pid;
31564a1cf0SFrans Kaashoek   release(&lk->lk);
32564a1cf0SFrans Kaashoek }
33564a1cf0SFrans Kaashoek 
34564a1cf0SFrans Kaashoek void
releasesleep(struct sleeplock * lk)35564a1cf0SFrans Kaashoek releasesleep(struct sleeplock *lk)
36564a1cf0SFrans Kaashoek {
37564a1cf0SFrans Kaashoek   acquire(&lk->lk);
38564a1cf0SFrans Kaashoek   lk->locked = 0;
39564a1cf0SFrans Kaashoek   lk->pid = 0;
40564a1cf0SFrans Kaashoek   wakeup(lk);
41564a1cf0SFrans Kaashoek   release(&lk->lk);
42564a1cf0SFrans Kaashoek }
43564a1cf0SFrans Kaashoek 
44564a1cf0SFrans Kaashoek int
holdingsleep(struct sleeplock * lk)45564a1cf0SFrans Kaashoek holdingsleep(struct sleeplock *lk)
46564a1cf0SFrans Kaashoek {
47564a1cf0SFrans Kaashoek   int r;
48564a1cf0SFrans Kaashoek 
49564a1cf0SFrans Kaashoek   acquire(&lk->lk);
50*0b86d037SFrans Kaashoek   r = lk->locked && (lk->pid == myproc()->pid);
51564a1cf0SFrans Kaashoek   release(&lk->lk);
52564a1cf0SFrans Kaashoek   return r;
53564a1cf0SFrans Kaashoek }
54564a1cf0SFrans Kaashoek 
55564a1cf0SFrans Kaashoek 
56564a1cf0SFrans Kaashoek 
57