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 Kaashoekinitsleeplock(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 Kaashoekacquiresleep(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 Kaashoekreleasesleep(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 Kaashoekholdingsleep(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