1 d3df3087 2003-12-06 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 d3df3087 2003-12-06 devnull /* See COPYRIGHT */
4 d3df3087 2003-12-06 devnull #include <u.h>
5 d3df3087 2003-12-06 devnull #include <libc.h>
6 d3df3087 2003-12-06 devnull #include <mux.h>
8 d3df3087 2003-12-06 devnull typedef struct Qel Qel;
9 d3df3087 2003-12-06 devnull struct Qel
11 d3df3087 2003-12-06 devnull Qel *next;
15 d3df3087 2003-12-06 devnull struct Muxqueue
17 d3df3087 2003-12-06 devnull int hungup;
18 d3df3087 2003-12-06 devnull QLock lk;
19 d3df3087 2003-12-06 devnull Rendez r;
20 d3df3087 2003-12-06 devnull Qel *head;
21 d3df3087 2003-12-06 devnull Qel *tail;
24 d3df3087 2003-12-06 devnull Muxqueue*
25 d3df3087 2003-12-06 devnull _muxqalloc(void)
27 d3df3087 2003-12-06 devnull Muxqueue *q;
29 d3df3087 2003-12-06 devnull q = mallocz(sizeof(Muxqueue), 1);
30 d3df3087 2003-12-06 devnull if(q == nil)
31 d3df3087 2003-12-06 devnull return nil;
32 d3df3087 2003-12-06 devnull q->r.l = &q->lk;
33 d3df3087 2003-12-06 devnull return q;
37 d3df3087 2003-12-06 devnull _muxqsend(Muxqueue *q, void *p)
41 d3df3087 2003-12-06 devnull e = malloc(sizeof(Qel));
42 d3df3087 2003-12-06 devnull if(e == nil)
43 d3df3087 2003-12-06 devnull return -1;
44 d3df3087 2003-12-06 devnull qlock(&q->lk);
45 d3df3087 2003-12-06 devnull if(q->hungup){
46 d3df3087 2003-12-06 devnull werrstr("hungup queue");
47 d3df3087 2003-12-06 devnull qunlock(&q->lk);
49 d3df3087 2003-12-06 devnull return -1;
51 d3df3087 2003-12-06 devnull e->p = p;
52 d3df3087 2003-12-06 devnull e->next = nil;
53 d3df3087 2003-12-06 devnull if(q->head == nil)
54 d3df3087 2003-12-06 devnull q->head = e;
56 d3df3087 2003-12-06 devnull q->tail->next = e;
57 d3df3087 2003-12-06 devnull q->tail = e;
58 d3df3087 2003-12-06 devnull rwakeup(&q->r);
59 d3df3087 2003-12-06 devnull qunlock(&q->lk);
60 d3df3087 2003-12-06 devnull return 0;
64 d3df3087 2003-12-06 devnull _muxqrecv(Muxqueue *q)
69 d3df3087 2003-12-06 devnull qlock(&q->lk);
70 d3df3087 2003-12-06 devnull while(q->head == nil && !q->hungup)
71 d3df3087 2003-12-06 devnull rsleep(&q->r);
72 d3df3087 2003-12-06 devnull if(q->hungup){
73 d3df3087 2003-12-06 devnull qunlock(&q->lk);
74 d3df3087 2003-12-06 devnull return nil;
76 d3df3087 2003-12-06 devnull e = q->head;
77 d3df3087 2003-12-06 devnull q->head = e->next;
78 d3df3087 2003-12-06 devnull qunlock(&q->lk);
79 d3df3087 2003-12-06 devnull p = e->p;
81 d3df3087 2003-12-06 devnull return p;
85 3a194702 2006-11-04 devnull _muxnbqrecv(Muxqueue *q, void **vp)
90 d3df3087 2003-12-06 devnull qlock(&q->lk);
91 d3df3087 2003-12-06 devnull if(q->head == nil){
92 d3df3087 2003-12-06 devnull qunlock(&q->lk);
93 3a194702 2006-11-04 devnull *vp = nil;
94 3a194702 2006-11-04 devnull return q->hungup;
96 d3df3087 2003-12-06 devnull e = q->head;
97 d3df3087 2003-12-06 devnull q->head = e->next;
98 d3df3087 2003-12-06 devnull qunlock(&q->lk);
99 d3df3087 2003-12-06 devnull p = e->p;
100 d3df3087 2003-12-06 devnull free(e);
101 3a194702 2006-11-04 devnull *vp = p;
102 3a194702 2006-11-04 devnull return 1;
106 d3df3087 2003-12-06 devnull _muxqhangup(Muxqueue *q)
108 d3df3087 2003-12-06 devnull qlock(&q->lk);
109 d3df3087 2003-12-06 devnull q->hungup = 1;
110 d3df3087 2003-12-06 devnull rwakeupall(&q->r);
111 d3df3087 2003-12-06 devnull qunlock(&q->lk);