Blame


1 d3df3087 2003-12-06 devnull /* Copyright (C) 2003 Russ Cox, Massachusetts Institute of Technology */
2 d3df3087 2003-12-06 devnull /* See COPYRIGHT */
3 d3df3087 2003-12-06 devnull
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>
7 d3df3087 2003-12-06 devnull
8 d3df3087 2003-12-06 devnull typedef struct Qel Qel;
9 d3df3087 2003-12-06 devnull struct Qel
10 d3df3087 2003-12-06 devnull {
11 d3df3087 2003-12-06 devnull Qel *next;
12 d3df3087 2003-12-06 devnull void *p;
13 d3df3087 2003-12-06 devnull };
14 d3df3087 2003-12-06 devnull
15 d3df3087 2003-12-06 devnull struct Muxqueue
16 d3df3087 2003-12-06 devnull {
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;
22 d3df3087 2003-12-06 devnull };
23 d3df3087 2003-12-06 devnull
24 d3df3087 2003-12-06 devnull Muxqueue*
25 d3df3087 2003-12-06 devnull _muxqalloc(void)
26 d3df3087 2003-12-06 devnull {
27 d3df3087 2003-12-06 devnull Muxqueue *q;
28 d3df3087 2003-12-06 devnull
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;
34 d3df3087 2003-12-06 devnull }
35 d3df3087 2003-12-06 devnull
36 d3df3087 2003-12-06 devnull int
37 d3df3087 2003-12-06 devnull _muxqsend(Muxqueue *q, void *p)
38 d3df3087 2003-12-06 devnull {
39 d3df3087 2003-12-06 devnull Qel *e;
40 d3df3087 2003-12-06 devnull
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 ac244f8d 2003-12-09 devnull free(e);
49 d3df3087 2003-12-06 devnull return -1;
50 d3df3087 2003-12-06 devnull }
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;
55 d3df3087 2003-12-06 devnull else
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;
61 d3df3087 2003-12-06 devnull }
62 d3df3087 2003-12-06 devnull
63 d3df3087 2003-12-06 devnull void*
64 d3df3087 2003-12-06 devnull _muxqrecv(Muxqueue *q)
65 d3df3087 2003-12-06 devnull {
66 d3df3087 2003-12-06 devnull void *p;
67 d3df3087 2003-12-06 devnull Qel *e;
68 d3df3087 2003-12-06 devnull
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;
75 d3df3087 2003-12-06 devnull }
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;
80 d3df3087 2003-12-06 devnull free(e);
81 d3df3087 2003-12-06 devnull return p;
82 d3df3087 2003-12-06 devnull }
83 d3df3087 2003-12-06 devnull
84 3a194702 2006-11-04 devnull int
85 3a194702 2006-11-04 devnull _muxnbqrecv(Muxqueue *q, void **vp)
86 d3df3087 2003-12-06 devnull {
87 d3df3087 2003-12-06 devnull void *p;
88 d3df3087 2003-12-06 devnull Qel *e;
89 d3df3087 2003-12-06 devnull
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;
95 d3df3087 2003-12-06 devnull }
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;
103 d3df3087 2003-12-06 devnull }
104 d3df3087 2003-12-06 devnull
105 d3df3087 2003-12-06 devnull void
106 d3df3087 2003-12-06 devnull _muxqhangup(Muxqueue *q)
107 d3df3087 2003-12-06 devnull {
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);
112 d3df3087 2003-12-06 devnull }