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 d3df3087 2003-12-06 devnull _muxnbqrecv(Muxqueue *q)
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 d3df3087 2003-12-06 devnull return nil;
95 d3df3087 2003-12-06 devnull e = q->head;
96 d3df3087 2003-12-06 devnull q->head = e->next;
97 d3df3087 2003-12-06 devnull qunlock(&q->lk);
98 d3df3087 2003-12-06 devnull p = e->p;
100 d3df3087 2003-12-06 devnull return p;
104 d3df3087 2003-12-06 devnull _muxqhangup(Muxqueue *q)
106 d3df3087 2003-12-06 devnull qlock(&q->lk);
107 d3df3087 2003-12-06 devnull q->hungup = 1;
108 d3df3087 2003-12-06 devnull rwakeupall(&q->r);
109 d3df3087 2003-12-06 devnull qunlock(&q->lk);