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);
48 d3df3087 2003-12-06 devnull return -1;
50 d3df3087 2003-12-06 devnull e->p = p;
51 d3df3087 2003-12-06 devnull e->next = nil;
52 d3df3087 2003-12-06 devnull if(q->head == nil)
53 d3df3087 2003-12-06 devnull q->head = e;
55 d3df3087 2003-12-06 devnull q->tail->next = e;
56 d3df3087 2003-12-06 devnull q->tail = e;
57 d3df3087 2003-12-06 devnull rwakeup(&q->r);
58 d3df3087 2003-12-06 devnull qunlock(&q->lk);
59 d3df3087 2003-12-06 devnull return 0;
63 d3df3087 2003-12-06 devnull _muxqrecv(Muxqueue *q)
68 d3df3087 2003-12-06 devnull qlock(&q->lk);
69 d3df3087 2003-12-06 devnull while(q->head == nil && !q->hungup)
70 d3df3087 2003-12-06 devnull rsleep(&q->r);
71 d3df3087 2003-12-06 devnull if(q->hungup){
72 d3df3087 2003-12-06 devnull qunlock(&q->lk);
73 d3df3087 2003-12-06 devnull return nil;
75 d3df3087 2003-12-06 devnull e = q->head;
76 d3df3087 2003-12-06 devnull q->head = e->next;
77 d3df3087 2003-12-06 devnull qunlock(&q->lk);
78 d3df3087 2003-12-06 devnull p = e->p;
80 d3df3087 2003-12-06 devnull return p;
84 d3df3087 2003-12-06 devnull _muxnbqrecv(Muxqueue *q)
89 d3df3087 2003-12-06 devnull qlock(&q->lk);
90 d3df3087 2003-12-06 devnull if(q->head == nil){
91 d3df3087 2003-12-06 devnull qunlock(&q->lk);
92 d3df3087 2003-12-06 devnull return nil;
94 d3df3087 2003-12-06 devnull e = q->head;
95 d3df3087 2003-12-06 devnull q->head = e->next;
96 d3df3087 2003-12-06 devnull qunlock(&q->lk);
97 d3df3087 2003-12-06 devnull p = e->p;
99 d3df3087 2003-12-06 devnull return p;
103 d3df3087 2003-12-06 devnull _muxqhangup(Muxqueue *q)
105 d3df3087 2003-12-06 devnull qlock(&q->lk);
106 d3df3087 2003-12-06 devnull q->hungup = 1;
107 d3df3087 2003-12-06 devnull rwakeupall(&q->r);
108 d3df3087 2003-12-06 devnull qunlock(&q->lk);