xref: /plan9/sys/src/cmd/unix/drawterm/kern/rendez.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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 Colombier sleep(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 Colombier wakeup(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