#include "u.h" #include "lib.h" #include "mem.h" #include "dat.h" #include "fns.h" void qlock(QLock *q) { Proc *p, *mp; lock(&q->use); if(!q->locked) { q->locked = 1; unlock(&q->use); return; } p = q->tail; mp = u->p; if(p == 0) q->head = mp; else p->qnext = mp; q->tail = mp; mp->qnext = 0; mp->state = Queueing; unlock(&q->use); sched(); } int canqlock(QLock *q) { lock(&q->use); if(q->locked) { unlock(&q->use); return 0; } q->locked = 1; unlock(&q->use); return 1; } void qunlock(QLock *q) { Proc *p; lock(&q->use); p = q->head; if(p) { q->head = p->qnext; if(q->head == 0) q->tail = 0; unlock(&q->use); ready(p); return; } q->locked = 0; unlock(&q->use); }