1*8ccd4a63SDavid du Colombier #include "u.h" 2*8ccd4a63SDavid du Colombier #include "lib.h" 3*8ccd4a63SDavid du Colombier #include "dat.h" 4*8ccd4a63SDavid du Colombier #include "fns.h" 5*8ccd4a63SDavid du Colombier #include "error.h" 6*8ccd4a63SDavid du Colombier 7*8ccd4a63SDavid du Colombier void sleep(Rendez * r,int (* f)(void *),void * arg)8*8ccd4a63SDavid du Colombiersleep(Rendez *r, int (*f)(void*), void *arg) 9*8ccd4a63SDavid du Colombier { 10*8ccd4a63SDavid du Colombier int s; 11*8ccd4a63SDavid du Colombier 12*8ccd4a63SDavid du Colombier s = splhi(); 13*8ccd4a63SDavid du Colombier 14*8ccd4a63SDavid du Colombier lock(&r->lk); 15*8ccd4a63SDavid du Colombier lock(&up->rlock); 16*8ccd4a63SDavid du Colombier if(r->p){ 17*8ccd4a63SDavid du Colombier print("double sleep %lud %lud\n", r->p->pid, up->pid); 18*8ccd4a63SDavid du Colombier dumpstack(); 19*8ccd4a63SDavid du Colombier } 20*8ccd4a63SDavid du Colombier 21*8ccd4a63SDavid du Colombier /* 22*8ccd4a63SDavid du Colombier * Wakeup only knows there may be something to do by testing 23*8ccd4a63SDavid du Colombier * r->p in order to get something to lock on. 24*8ccd4a63SDavid du Colombier * Flush that information out to memory in case the sleep is 25*8ccd4a63SDavid du Colombier * committed. 26*8ccd4a63SDavid du Colombier */ 27*8ccd4a63SDavid du Colombier r->p = up; 28*8ccd4a63SDavid du Colombier 29*8ccd4a63SDavid du Colombier if((*f)(arg) || up->notepending){ 30*8ccd4a63SDavid du Colombier /* 31*8ccd4a63SDavid du Colombier * if condition happened or a note is pending 32*8ccd4a63SDavid du Colombier * never mind 33*8ccd4a63SDavid du Colombier */ 34*8ccd4a63SDavid du Colombier r->p = nil; 35*8ccd4a63SDavid du Colombier unlock(&up->rlock); 36*8ccd4a63SDavid du Colombier unlock(&r->lk); 37*8ccd4a63SDavid du Colombier } else { 38*8ccd4a63SDavid du Colombier /* 39*8ccd4a63SDavid du Colombier * now we are committed to 40*8ccd4a63SDavid du Colombier * change state and call scheduler 41*8ccd4a63SDavid du Colombier */ 42*8ccd4a63SDavid du Colombier up->state = Wakeme; 43*8ccd4a63SDavid du Colombier up->r = r; 44*8ccd4a63SDavid du Colombier 45*8ccd4a63SDavid du Colombier /* statistics */ 46*8ccd4a63SDavid du Colombier /* m->cs++; */ 47*8ccd4a63SDavid du Colombier 48*8ccd4a63SDavid du Colombier unlock(&up->rlock); 49*8ccd4a63SDavid du Colombier unlock(&r->lk); 50*8ccd4a63SDavid du Colombier 51*8ccd4a63SDavid du Colombier procsleep(); 52*8ccd4a63SDavid du Colombier } 53*8ccd4a63SDavid du Colombier 54*8ccd4a63SDavid du Colombier if(up->notepending) { 55*8ccd4a63SDavid du Colombier up->notepending = 0; 56*8ccd4a63SDavid du Colombier splx(s); 57*8ccd4a63SDavid du Colombier error(Eintr); 58*8ccd4a63SDavid du Colombier } 59*8ccd4a63SDavid du Colombier 60*8ccd4a63SDavid du Colombier splx(s); 61*8ccd4a63SDavid du Colombier } 62*8ccd4a63SDavid du Colombier 63*8ccd4a63SDavid du Colombier Proc* wakeup(Rendez * r)64*8ccd4a63SDavid du Colombierwakeup(Rendez *r) 65*8ccd4a63SDavid du Colombier { 66*8ccd4a63SDavid du Colombier Proc *p; 67*8ccd4a63SDavid du Colombier int s; 68*8ccd4a63SDavid du Colombier 69*8ccd4a63SDavid du Colombier s = splhi(); 70*8ccd4a63SDavid du Colombier 71*8ccd4a63SDavid du Colombier lock(&r->lk); 72*8ccd4a63SDavid du Colombier p = r->p; 73*8ccd4a63SDavid du Colombier 74*8ccd4a63SDavid du Colombier if(p != nil){ 75*8ccd4a63SDavid du Colombier lock(&p->rlock); 76*8ccd4a63SDavid du Colombier if(p->state != Wakeme || p->r != r) 77*8ccd4a63SDavid du Colombier panic("wakeup: state"); 78*8ccd4a63SDavid du Colombier r->p = nil; 79*8ccd4a63SDavid du Colombier p->r = nil; 80*8ccd4a63SDavid du Colombier p->state = Running; 81*8ccd4a63SDavid du Colombier procwakeup(p); 82*8ccd4a63SDavid du Colombier unlock(&p->rlock); 83*8ccd4a63SDavid du Colombier } 84*8ccd4a63SDavid du Colombier unlock(&r->lk); 85*8ccd4a63SDavid du Colombier 86*8ccd4a63SDavid du Colombier splx(s); 87*8ccd4a63SDavid du Colombier 88*8ccd4a63SDavid du Colombier return p; 89*8ccd4a63SDavid du Colombier } 90*8ccd4a63SDavid du Colombier 91