xref: /xv6-public/sleeplock.c (revision 564a1cf0)
1*564a1cf0SFrans Kaashoek // Sleeping locks
2*564a1cf0SFrans Kaashoek 
3*564a1cf0SFrans Kaashoek #include "types.h"
4*564a1cf0SFrans Kaashoek #include "defs.h"
5*564a1cf0SFrans Kaashoek #include "param.h"
6*564a1cf0SFrans Kaashoek #include "x86.h"
7*564a1cf0SFrans Kaashoek #include "memlayout.h"
8*564a1cf0SFrans Kaashoek #include "mmu.h"
9*564a1cf0SFrans Kaashoek #include "proc.h"
10*564a1cf0SFrans Kaashoek #include "spinlock.h"
11*564a1cf0SFrans Kaashoek #include "sleeplock.h"
12*564a1cf0SFrans Kaashoek 
13*564a1cf0SFrans Kaashoek void
14*564a1cf0SFrans Kaashoek initsleeplock(struct sleeplock *lk, char *name)
15*564a1cf0SFrans Kaashoek {
16*564a1cf0SFrans Kaashoek   initlock(&lk->lk, "sleep lock");
17*564a1cf0SFrans Kaashoek   lk->name = name;
18*564a1cf0SFrans Kaashoek   lk->locked = 0;
19*564a1cf0SFrans Kaashoek   lk->pid = 0;
20*564a1cf0SFrans Kaashoek }
21*564a1cf0SFrans Kaashoek 
22*564a1cf0SFrans Kaashoek void
23*564a1cf0SFrans Kaashoek acquiresleep(struct sleeplock *lk)
24*564a1cf0SFrans Kaashoek {
25*564a1cf0SFrans Kaashoek   acquire(&lk->lk);
26*564a1cf0SFrans Kaashoek   while (lk->locked) {
27*564a1cf0SFrans Kaashoek     sleep(lk, &lk->lk);
28*564a1cf0SFrans Kaashoek   }
29*564a1cf0SFrans Kaashoek   lk->locked = 1;
30*564a1cf0SFrans Kaashoek   lk->pid = proc->pid;
31*564a1cf0SFrans Kaashoek   release(&lk->lk);
32*564a1cf0SFrans Kaashoek }
33*564a1cf0SFrans Kaashoek 
34*564a1cf0SFrans Kaashoek void
35*564a1cf0SFrans Kaashoek releasesleep(struct sleeplock *lk)
36*564a1cf0SFrans Kaashoek {
37*564a1cf0SFrans Kaashoek   acquire(&lk->lk);
38*564a1cf0SFrans Kaashoek   lk->locked = 0;
39*564a1cf0SFrans Kaashoek   lk->pid = 0;
40*564a1cf0SFrans Kaashoek   wakeup(lk);
41*564a1cf0SFrans Kaashoek   release(&lk->lk);
42*564a1cf0SFrans Kaashoek }
43*564a1cf0SFrans Kaashoek 
44*564a1cf0SFrans Kaashoek int
45*564a1cf0SFrans Kaashoek holdingsleep(struct sleeplock *lk)
46*564a1cf0SFrans Kaashoek {
47*564a1cf0SFrans Kaashoek   int r;
48*564a1cf0SFrans Kaashoek 
49*564a1cf0SFrans Kaashoek   acquire(&lk->lk);
50*564a1cf0SFrans Kaashoek   r = lk->locked;
51*564a1cf0SFrans Kaashoek   release(&lk->lk);
52*564a1cf0SFrans Kaashoek   return r;
53*564a1cf0SFrans Kaashoek }
54*564a1cf0SFrans Kaashoek 
55*564a1cf0SFrans Kaashoek 
56*564a1cf0SFrans Kaashoek 
57