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