Blame


1 b2cfc4e2 2003-09-30 devnull #include <lib9.h>
2 b2cfc4e2 2003-09-30 devnull
3 b2cfc4e2 2003-09-30 devnull static struct {
4 b2cfc4e2 2003-09-30 devnull QLp *p;
5 b2cfc4e2 2003-09-30 devnull QLp x[1024];
6 b2cfc4e2 2003-09-30 devnull } ql = {
7 b2cfc4e2 2003-09-30 devnull ql.x
8 b2cfc4e2 2003-09-30 devnull };
9 b2cfc4e2 2003-09-30 devnull
10 b2cfc4e2 2003-09-30 devnull enum
11 b2cfc4e2 2003-09-30 devnull {
12 b2cfc4e2 2003-09-30 devnull Queuing,
13 b2cfc4e2 2003-09-30 devnull QueuingR,
14 b2cfc4e2 2003-09-30 devnull QueuingW,
15 b2cfc4e2 2003-09-30 devnull Sleeping,
16 6c746070 2004-05-23 devnull Waking,
17 b2cfc4e2 2003-09-30 devnull };
18 b2cfc4e2 2003-09-30 devnull
19 06bb4ed2 2004-09-17 devnull static void (*procsleep)(_Procrend*) = _procsleep;
20 06bb4ed2 2004-09-17 devnull static void (*procwakeup)(_Procrend*) = _procwakeup;
21 c6687d45 2004-09-21 devnull #define _procsleep donotcall_procsleep
22 c6687d45 2004-09-21 devnull #define _procwakeup donotcall_procwakeup
23 b2cfc4e2 2003-09-30 devnull
24 b2cfc4e2 2003-09-30 devnull /* this gets called by the thread library ONLY to get us to use its rendezvous */
25 b2cfc4e2 2003-09-30 devnull void
26 06bb4ed2 2004-09-17 devnull _qlockinit(void (*sleep)(_Procrend*), void (*wakeup)(_Procrend*))
27 b2cfc4e2 2003-09-30 devnull {
28 06bb4ed2 2004-09-17 devnull procsleep = sleep;
29 06bb4ed2 2004-09-17 devnull procwakeup = wakeup;
30 b2cfc4e2 2003-09-30 devnull }
31 b2cfc4e2 2003-09-30 devnull
32 b2cfc4e2 2003-09-30 devnull /* find a free shared memory location to queue ourselves in */
33 b2cfc4e2 2003-09-30 devnull static QLp*
34 b2cfc4e2 2003-09-30 devnull getqlp(void)
35 b2cfc4e2 2003-09-30 devnull {
36 b2cfc4e2 2003-09-30 devnull QLp *p, *op;
37 b2cfc4e2 2003-09-30 devnull
38 b2cfc4e2 2003-09-30 devnull op = ql.p;
39 b2cfc4e2 2003-09-30 devnull for(p = op+1; ; p++){
40 b2cfc4e2 2003-09-30 devnull if(p == &ql.x[nelem(ql.x)])
41 b2cfc4e2 2003-09-30 devnull p = ql.x;
42 be36ff68 2004-04-29 devnull if(p == op){
43 be36ff68 2004-04-29 devnull fprint(2, "qlock: out of qlp\n");
44 b2cfc4e2 2003-09-30 devnull abort();
45 be36ff68 2004-04-29 devnull }
46 06bb4ed2 2004-09-17 devnull if(canlock(&p->inuse)){
47 b2cfc4e2 2003-09-30 devnull ql.p = p;
48 b2cfc4e2 2003-09-30 devnull p->next = nil;
49 b2cfc4e2 2003-09-30 devnull break;
50 b2cfc4e2 2003-09-30 devnull }
51 b2cfc4e2 2003-09-30 devnull }
52 b2cfc4e2 2003-09-30 devnull return p;
53 b2cfc4e2 2003-09-30 devnull }
54 b2cfc4e2 2003-09-30 devnull
55 b2cfc4e2 2003-09-30 devnull void
56 b2cfc4e2 2003-09-30 devnull qlock(QLock *q)
57 b2cfc4e2 2003-09-30 devnull {
58 b2cfc4e2 2003-09-30 devnull QLp *p, *mp;
59 b2cfc4e2 2003-09-30 devnull
60 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
61 b2cfc4e2 2003-09-30 devnull if(!q->locked){
62 b2cfc4e2 2003-09-30 devnull q->locked = 1;
63 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
64 b2cfc4e2 2003-09-30 devnull return;
65 b2cfc4e2 2003-09-30 devnull }
66 b2cfc4e2 2003-09-30 devnull
67 b2cfc4e2 2003-09-30 devnull
68 b2cfc4e2 2003-09-30 devnull /* chain into waiting list */
69 b2cfc4e2 2003-09-30 devnull mp = getqlp();
70 b2cfc4e2 2003-09-30 devnull p = q->tail;
71 b2cfc4e2 2003-09-30 devnull if(p == nil)
72 b2cfc4e2 2003-09-30 devnull q->head = mp;
73 b2cfc4e2 2003-09-30 devnull else
74 b2cfc4e2 2003-09-30 devnull p->next = mp;
75 b2cfc4e2 2003-09-30 devnull q->tail = mp;
76 b2cfc4e2 2003-09-30 devnull mp->state = Queuing;
77 06bb4ed2 2004-09-17 devnull mp->rend.l = &q->lock;
78 c6687d45 2004-09-21 devnull procsleep(&mp->rend);
79 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
80 6c746070 2004-05-23 devnull assert(mp->state == Waking);
81 06bb4ed2 2004-09-17 devnull unlock(&mp->inuse);
82 b2cfc4e2 2003-09-30 devnull }
83 b2cfc4e2 2003-09-30 devnull
84 b2cfc4e2 2003-09-30 devnull void
85 b2cfc4e2 2003-09-30 devnull qunlock(QLock *q)
86 b2cfc4e2 2003-09-30 devnull {
87 b2cfc4e2 2003-09-30 devnull QLp *p;
88 b2cfc4e2 2003-09-30 devnull
89 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
90 b2cfc4e2 2003-09-30 devnull p = q->head;
91 b2cfc4e2 2003-09-30 devnull if(p != nil){
92 b2cfc4e2 2003-09-30 devnull /* wakeup head waiting process */
93 b2cfc4e2 2003-09-30 devnull q->head = p->next;
94 b2cfc4e2 2003-09-30 devnull if(q->head == nil)
95 b2cfc4e2 2003-09-30 devnull q->tail = nil;
96 6c746070 2004-05-23 devnull p->state = Waking;
97 c6687d45 2004-09-21 devnull procwakeup(&p->rend);
98 06bb4ed2 2004-09-17 devnull unlock(&q->lock);
99 b2cfc4e2 2003-09-30 devnull return;
100 b2cfc4e2 2003-09-30 devnull }
101 b2cfc4e2 2003-09-30 devnull q->locked = 0;
102 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
103 b2cfc4e2 2003-09-30 devnull }
104 b2cfc4e2 2003-09-30 devnull
105 b2cfc4e2 2003-09-30 devnull int
106 b2cfc4e2 2003-09-30 devnull canqlock(QLock *q)
107 b2cfc4e2 2003-09-30 devnull {
108 b2cfc4e2 2003-09-30 devnull if(!canlock(&q->lock))
109 b2cfc4e2 2003-09-30 devnull return 0;
110 b2cfc4e2 2003-09-30 devnull if(!q->locked){
111 b2cfc4e2 2003-09-30 devnull q->locked = 1;
112 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
113 b2cfc4e2 2003-09-30 devnull return 1;
114 b2cfc4e2 2003-09-30 devnull }
115 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
116 b2cfc4e2 2003-09-30 devnull return 0;
117 b2cfc4e2 2003-09-30 devnull }
118 b2cfc4e2 2003-09-30 devnull
119 b2cfc4e2 2003-09-30 devnull void
120 b2cfc4e2 2003-09-30 devnull rlock(RWLock *q)
121 b2cfc4e2 2003-09-30 devnull {
122 b2cfc4e2 2003-09-30 devnull QLp *p, *mp;
123 b2cfc4e2 2003-09-30 devnull
124 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
125 b2cfc4e2 2003-09-30 devnull if(q->writer == 0 && q->head == nil){
126 b2cfc4e2 2003-09-30 devnull /* no writer, go for it */
127 b2cfc4e2 2003-09-30 devnull q->readers++;
128 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
129 b2cfc4e2 2003-09-30 devnull return;
130 b2cfc4e2 2003-09-30 devnull }
131 b2cfc4e2 2003-09-30 devnull
132 b2cfc4e2 2003-09-30 devnull mp = getqlp();
133 b2cfc4e2 2003-09-30 devnull p = q->tail;
134 b2cfc4e2 2003-09-30 devnull if(p == 0)
135 b2cfc4e2 2003-09-30 devnull q->head = mp;
136 b2cfc4e2 2003-09-30 devnull else
137 b2cfc4e2 2003-09-30 devnull p->next = mp;
138 b2cfc4e2 2003-09-30 devnull q->tail = mp;
139 b2cfc4e2 2003-09-30 devnull mp->next = nil;
140 b2cfc4e2 2003-09-30 devnull mp->state = QueuingR;
141 06bb4ed2 2004-09-17 devnull mp->rend.l = &q->lock;
142 c6687d45 2004-09-21 devnull procsleep(&mp->rend);
143 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
144 6c746070 2004-05-23 devnull assert(mp->state == Waking);
145 06bb4ed2 2004-09-17 devnull unlock(&mp->inuse);
146 b2cfc4e2 2003-09-30 devnull }
147 b2cfc4e2 2003-09-30 devnull
148 b2cfc4e2 2003-09-30 devnull int
149 b2cfc4e2 2003-09-30 devnull canrlock(RWLock *q)
150 b2cfc4e2 2003-09-30 devnull {
151 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
152 b2cfc4e2 2003-09-30 devnull if (q->writer == 0 && q->head == nil) {
153 b2cfc4e2 2003-09-30 devnull /* no writer; go for it */
154 b2cfc4e2 2003-09-30 devnull q->readers++;
155 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
156 b2cfc4e2 2003-09-30 devnull return 1;
157 b2cfc4e2 2003-09-30 devnull }
158 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
159 b2cfc4e2 2003-09-30 devnull return 0;
160 b2cfc4e2 2003-09-30 devnull }
161 b2cfc4e2 2003-09-30 devnull
162 b2cfc4e2 2003-09-30 devnull void
163 b2cfc4e2 2003-09-30 devnull runlock(RWLock *q)
164 b2cfc4e2 2003-09-30 devnull {
165 b2cfc4e2 2003-09-30 devnull QLp *p;
166 b2cfc4e2 2003-09-30 devnull
167 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
168 b2cfc4e2 2003-09-30 devnull if(q->readers <= 0)
169 b2cfc4e2 2003-09-30 devnull abort();
170 b2cfc4e2 2003-09-30 devnull p = q->head;
171 b2cfc4e2 2003-09-30 devnull if(--(q->readers) > 0 || p == nil){
172 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
173 b2cfc4e2 2003-09-30 devnull return;
174 b2cfc4e2 2003-09-30 devnull }
175 b2cfc4e2 2003-09-30 devnull
176 b2cfc4e2 2003-09-30 devnull /* start waiting writer */
177 b2cfc4e2 2003-09-30 devnull if(p->state != QueuingW)
178 b2cfc4e2 2003-09-30 devnull abort();
179 b2cfc4e2 2003-09-30 devnull q->head = p->next;
180 b2cfc4e2 2003-09-30 devnull if(q->head == 0)
181 b2cfc4e2 2003-09-30 devnull q->tail = 0;
182 b2cfc4e2 2003-09-30 devnull q->writer = 1;
183 b2cfc4e2 2003-09-30 devnull
184 b2cfc4e2 2003-09-30 devnull /* wakeup waiter */
185 6c746070 2004-05-23 devnull p->state = Waking;
186 c6687d45 2004-09-21 devnull procwakeup(&p->rend);
187 06bb4ed2 2004-09-17 devnull unlock(&q->lock);
188 b2cfc4e2 2003-09-30 devnull }
189 b2cfc4e2 2003-09-30 devnull
190 b2cfc4e2 2003-09-30 devnull void
191 b2cfc4e2 2003-09-30 devnull wlock(RWLock *q)
192 b2cfc4e2 2003-09-30 devnull {
193 b2cfc4e2 2003-09-30 devnull QLp *p, *mp;
194 b2cfc4e2 2003-09-30 devnull
195 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
196 b2cfc4e2 2003-09-30 devnull if(q->readers == 0 && q->writer == 0){
197 b2cfc4e2 2003-09-30 devnull /* noone waiting, go for it */
198 b2cfc4e2 2003-09-30 devnull q->writer = 1;
199 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
200 b2cfc4e2 2003-09-30 devnull return;
201 b2cfc4e2 2003-09-30 devnull }
202 b2cfc4e2 2003-09-30 devnull
203 b2cfc4e2 2003-09-30 devnull /* wait */
204 b2cfc4e2 2003-09-30 devnull p = q->tail;
205 b2cfc4e2 2003-09-30 devnull mp = getqlp();
206 b2cfc4e2 2003-09-30 devnull if(p == nil)
207 b2cfc4e2 2003-09-30 devnull q->head = mp;
208 b2cfc4e2 2003-09-30 devnull else
209 b2cfc4e2 2003-09-30 devnull p->next = mp;
210 b2cfc4e2 2003-09-30 devnull q->tail = mp;
211 b2cfc4e2 2003-09-30 devnull mp->next = nil;
212 b2cfc4e2 2003-09-30 devnull mp->state = QueuingW;
213 b2cfc4e2 2003-09-30 devnull
214 b2cfc4e2 2003-09-30 devnull /* wait in kernel */
215 06bb4ed2 2004-09-17 devnull mp->rend.l = &q->lock;
216 c6687d45 2004-09-21 devnull procsleep(&mp->rend);
217 06bb4ed2 2004-09-17 devnull unlock(&q->lock);
218 6c746070 2004-05-23 devnull assert(mp->state == Waking);
219 06bb4ed2 2004-09-17 devnull unlock(&mp->inuse);
220 b2cfc4e2 2003-09-30 devnull }
221 b2cfc4e2 2003-09-30 devnull
222 b2cfc4e2 2003-09-30 devnull int
223 b2cfc4e2 2003-09-30 devnull canwlock(RWLock *q)
224 b2cfc4e2 2003-09-30 devnull {
225 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
226 b2cfc4e2 2003-09-30 devnull if (q->readers == 0 && q->writer == 0) {
227 b2cfc4e2 2003-09-30 devnull /* no one waiting; go for it */
228 b2cfc4e2 2003-09-30 devnull q->writer = 1;
229 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
230 b2cfc4e2 2003-09-30 devnull return 1;
231 b2cfc4e2 2003-09-30 devnull }
232 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
233 b2cfc4e2 2003-09-30 devnull return 0;
234 b2cfc4e2 2003-09-30 devnull }
235 b2cfc4e2 2003-09-30 devnull
236 b2cfc4e2 2003-09-30 devnull void
237 b2cfc4e2 2003-09-30 devnull wunlock(RWLock *q)
238 b2cfc4e2 2003-09-30 devnull {
239 b2cfc4e2 2003-09-30 devnull QLp *p;
240 b2cfc4e2 2003-09-30 devnull
241 b2cfc4e2 2003-09-30 devnull lock(&q->lock);
242 be36ff68 2004-04-29 devnull if(q->writer == 0){
243 be36ff68 2004-04-29 devnull fprint(2, "wunlock: not holding lock\n");
244 b2cfc4e2 2003-09-30 devnull abort();
245 be36ff68 2004-04-29 devnull }
246 b2cfc4e2 2003-09-30 devnull p = q->head;
247 b2cfc4e2 2003-09-30 devnull if(p == nil){
248 b2cfc4e2 2003-09-30 devnull q->writer = 0;
249 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
250 b2cfc4e2 2003-09-30 devnull return;
251 b2cfc4e2 2003-09-30 devnull }
252 b2cfc4e2 2003-09-30 devnull if(p->state == QueuingW){
253 b2cfc4e2 2003-09-30 devnull /* start waiting writer */
254 b2cfc4e2 2003-09-30 devnull q->head = p->next;
255 b2cfc4e2 2003-09-30 devnull if(q->head == nil)
256 b2cfc4e2 2003-09-30 devnull q->tail = nil;
257 6c746070 2004-05-23 devnull p->state = Waking;
258 c6687d45 2004-09-21 devnull procwakeup(&p->rend);
259 06bb4ed2 2004-09-17 devnull unlock(&q->lock);
260 b2cfc4e2 2003-09-30 devnull return;
261 b2cfc4e2 2003-09-30 devnull }
262 b2cfc4e2 2003-09-30 devnull
263 be36ff68 2004-04-29 devnull if(p->state != QueuingR){
264 be36ff68 2004-04-29 devnull fprint(2, "wunlock: bad state\n");
265 b2cfc4e2 2003-09-30 devnull abort();
266 be36ff68 2004-04-29 devnull }
267 b2cfc4e2 2003-09-30 devnull
268 b2cfc4e2 2003-09-30 devnull /* wake waiting readers */
269 b2cfc4e2 2003-09-30 devnull while(q->head != nil && q->head->state == QueuingR){
270 b2cfc4e2 2003-09-30 devnull p = q->head;
271 b2cfc4e2 2003-09-30 devnull q->head = p->next;
272 b2cfc4e2 2003-09-30 devnull q->readers++;
273 6c746070 2004-05-23 devnull p->state = Waking;
274 c6687d45 2004-09-21 devnull procwakeup(&p->rend);
275 b2cfc4e2 2003-09-30 devnull }
276 b2cfc4e2 2003-09-30 devnull if(q->head == nil)
277 b2cfc4e2 2003-09-30 devnull q->tail = nil;
278 b2cfc4e2 2003-09-30 devnull q->writer = 0;
279 b2cfc4e2 2003-09-30 devnull unlock(&q->lock);
280 b2cfc4e2 2003-09-30 devnull }
281 b2cfc4e2 2003-09-30 devnull
282 b2cfc4e2 2003-09-30 devnull void
283 b2cfc4e2 2003-09-30 devnull rsleep(Rendez *r)
284 b2cfc4e2 2003-09-30 devnull {
285 b2cfc4e2 2003-09-30 devnull QLp *t, *me;
286 b2cfc4e2 2003-09-30 devnull
287 be36ff68 2004-04-29 devnull if(!r->l){
288 be36ff68 2004-04-29 devnull fprint(2, "rsleep: no lock\n");
289 b2cfc4e2 2003-09-30 devnull abort();
290 be36ff68 2004-04-29 devnull }
291 b2cfc4e2 2003-09-30 devnull lock(&r->l->lock);
292 b2cfc4e2 2003-09-30 devnull /* we should hold the qlock */
293 be36ff68 2004-04-29 devnull if(!r->l->locked){
294 be36ff68 2004-04-29 devnull fprint(2, "rsleep: not locked\n");
295 b2cfc4e2 2003-09-30 devnull abort();
296 be36ff68 2004-04-29 devnull }
297 b2cfc4e2 2003-09-30 devnull
298 b2cfc4e2 2003-09-30 devnull /* add ourselves to the wait list */
299 b2cfc4e2 2003-09-30 devnull me = getqlp();
300 b2cfc4e2 2003-09-30 devnull me->state = Sleeping;
301 b2cfc4e2 2003-09-30 devnull if(r->head == nil)
302 b2cfc4e2 2003-09-30 devnull r->head = me;
303 b2cfc4e2 2003-09-30 devnull else
304 b2cfc4e2 2003-09-30 devnull r->tail->next = me;
305 b2cfc4e2 2003-09-30 devnull me->next = nil;
306 b2cfc4e2 2003-09-30 devnull r->tail = me;
307 b2cfc4e2 2003-09-30 devnull
308 b2cfc4e2 2003-09-30 devnull /* pass the qlock to the next guy */
309 b2cfc4e2 2003-09-30 devnull t = r->l->head;
310 b2cfc4e2 2003-09-30 devnull if(t){
311 b2cfc4e2 2003-09-30 devnull r->l->head = t->next;
312 b2cfc4e2 2003-09-30 devnull if(r->l->head == nil)
313 b2cfc4e2 2003-09-30 devnull r->l->tail = nil;
314 6c746070 2004-05-23 devnull t->state = Waking;
315 c6687d45 2004-09-21 devnull procwakeup(&t->rend);
316 06bb4ed2 2004-09-17 devnull }else
317 b2cfc4e2 2003-09-30 devnull r->l->locked = 0;
318 b2cfc4e2 2003-09-30 devnull
319 b2cfc4e2 2003-09-30 devnull /* wait for a wakeup */
320 06bb4ed2 2004-09-17 devnull me->rend.l = &r->l->lock;
321 c6687d45 2004-09-21 devnull procsleep(&me->rend);
322 6c746070 2004-05-23 devnull assert(me->state == Waking);
323 06bb4ed2 2004-09-17 devnull unlock(&me->inuse);
324 be36ff68 2004-04-29 devnull if(!r->l->locked){
325 be36ff68 2004-04-29 devnull fprint(2, "rsleep: not locked after wakeup\n");
326 b2cfc4e2 2003-09-30 devnull abort();
327 be36ff68 2004-04-29 devnull }
328 c6687d45 2004-09-21 devnull unlock(&r->l->lock);
329 b2cfc4e2 2003-09-30 devnull }
330 b2cfc4e2 2003-09-30 devnull
331 b2cfc4e2 2003-09-30 devnull int
332 b2cfc4e2 2003-09-30 devnull rwakeup(Rendez *r)
333 b2cfc4e2 2003-09-30 devnull {
334 b2cfc4e2 2003-09-30 devnull QLp *t;
335 b2cfc4e2 2003-09-30 devnull
336 b2cfc4e2 2003-09-30 devnull /*
337 b2cfc4e2 2003-09-30 devnull * take off wait and put on front of queue
338 b2cfc4e2 2003-09-30 devnull * put on front so guys that have been waiting will not get starved
339 b2cfc4e2 2003-09-30 devnull */
340 b2cfc4e2 2003-09-30 devnull
341 be36ff68 2004-04-29 devnull if(!r->l){
342 be36ff68 2004-04-29 devnull fprint(2, "rwakeup: no lock\n");
343 b2cfc4e2 2003-09-30 devnull abort();
344 be36ff68 2004-04-29 devnull }
345 b2cfc4e2 2003-09-30 devnull lock(&r->l->lock);
346 be36ff68 2004-04-29 devnull if(!r->l->locked){
347 be36ff68 2004-04-29 devnull fprint(2, "rwakeup: not locked\n");
348 b2cfc4e2 2003-09-30 devnull abort();
349 be36ff68 2004-04-29 devnull }
350 b2cfc4e2 2003-09-30 devnull
351 b2cfc4e2 2003-09-30 devnull t = r->head;
352 b2cfc4e2 2003-09-30 devnull if(t == nil){
353 b2cfc4e2 2003-09-30 devnull unlock(&r->l->lock);
354 b2cfc4e2 2003-09-30 devnull return 0;
355 b2cfc4e2 2003-09-30 devnull }
356 b2cfc4e2 2003-09-30 devnull
357 b2cfc4e2 2003-09-30 devnull r->head = t->next;
358 b2cfc4e2 2003-09-30 devnull if(r->head == nil)
359 b2cfc4e2 2003-09-30 devnull r->tail = nil;
360 b2cfc4e2 2003-09-30 devnull
361 b2cfc4e2 2003-09-30 devnull t->next = r->l->head;
362 b2cfc4e2 2003-09-30 devnull r->l->head = t;
363 b2cfc4e2 2003-09-30 devnull if(r->l->tail == nil)
364 b2cfc4e2 2003-09-30 devnull r->l->tail = t;
365 b2cfc4e2 2003-09-30 devnull
366 b2cfc4e2 2003-09-30 devnull t->state = Queuing;
367 b2cfc4e2 2003-09-30 devnull unlock(&r->l->lock);
368 b2cfc4e2 2003-09-30 devnull return 1;
369 b2cfc4e2 2003-09-30 devnull }
370 b2cfc4e2 2003-09-30 devnull
371 b2cfc4e2 2003-09-30 devnull int
372 b2cfc4e2 2003-09-30 devnull rwakeupall(Rendez *r)
373 b2cfc4e2 2003-09-30 devnull {
374 b2cfc4e2 2003-09-30 devnull int i;
375 b2cfc4e2 2003-09-30 devnull
376 b2cfc4e2 2003-09-30 devnull for(i=0; rwakeup(r); i++)
377 b2cfc4e2 2003-09-30 devnull ;
378 b2cfc4e2 2003-09-30 devnull return i;
379 06bb4ed2 2004-09-17 devnull }