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