Blame


1 056fe1ba 2003-11-23 devnull #include <u.h>
2 056fe1ba 2003-11-23 devnull #include <libc.h>
3 056fe1ba 2003-11-23 devnull #include <venti.h>
4 056fe1ba 2003-11-23 devnull #include "queue.h"
5 056fe1ba 2003-11-23 devnull
6 056fe1ba 2003-11-23 devnull typedef struct Qel Qel;
7 056fe1ba 2003-11-23 devnull struct Qel
8 056fe1ba 2003-11-23 devnull {
9 056fe1ba 2003-11-23 devnull Qel *next;
10 056fe1ba 2003-11-23 devnull void *p;
11 056fe1ba 2003-11-23 devnull };
12 056fe1ba 2003-11-23 devnull
13 056fe1ba 2003-11-23 devnull struct Queue
14 056fe1ba 2003-11-23 devnull {
15 4f6d2bb1 2007-04-08 devnull int ref;
16 056fe1ba 2003-11-23 devnull int hungup;
17 056fe1ba 2003-11-23 devnull QLock lk;
18 056fe1ba 2003-11-23 devnull Rendez r;
19 056fe1ba 2003-11-23 devnull Qel *head;
20 056fe1ba 2003-11-23 devnull Qel *tail;
21 056fe1ba 2003-11-23 devnull };
22 056fe1ba 2003-11-23 devnull
23 056fe1ba 2003-11-23 devnull Queue*
24 056fe1ba 2003-11-23 devnull _vtqalloc(void)
25 056fe1ba 2003-11-23 devnull {
26 056fe1ba 2003-11-23 devnull Queue *q;
27 056fe1ba 2003-11-23 devnull
28 056fe1ba 2003-11-23 devnull q = vtmallocz(sizeof(Queue));
29 056fe1ba 2003-11-23 devnull q->r.l = &q->lk;
30 4f6d2bb1 2007-04-08 devnull q->ref = 1;
31 056fe1ba 2003-11-23 devnull return q;
32 056fe1ba 2003-11-23 devnull }
33 056fe1ba 2003-11-23 devnull
34 4f6d2bb1 2007-04-08 devnull Queue*
35 4f6d2bb1 2007-04-08 devnull _vtqincref(Queue *q)
36 4f6d2bb1 2007-04-08 devnull {
37 4f6d2bb1 2007-04-08 devnull qlock(&q->lk);
38 4f6d2bb1 2007-04-08 devnull q->ref++;
39 4f6d2bb1 2007-04-08 devnull qunlock(&q->lk);
40 4f6d2bb1 2007-04-08 devnull return q;
41 4f6d2bb1 2007-04-08 devnull }
42 4f6d2bb1 2007-04-08 devnull
43 6fc7da3c 2006-10-19 devnull void
44 4f6d2bb1 2007-04-08 devnull _vtqdecref(Queue *q)
45 6fc7da3c 2006-10-19 devnull {
46 6fc7da3c 2006-10-19 devnull Qel *e;
47 fa325e9b 2020-01-10 cross
48 4f6d2bb1 2007-04-08 devnull qlock(&q->lk);
49 4f6d2bb1 2007-04-08 devnull if(--q->ref > 0){
50 4f6d2bb1 2007-04-08 devnull qunlock(&q->lk);
51 4f6d2bb1 2007-04-08 devnull return;
52 4f6d2bb1 2007-04-08 devnull }
53 4f6d2bb1 2007-04-08 devnull assert(q->ref == 0);
54 4f6d2bb1 2007-04-08 devnull qunlock(&q->lk);
55 4f6d2bb1 2007-04-08 devnull
56 6fc7da3c 2006-10-19 devnull /* Leaks the pointers e->p! */
57 6fc7da3c 2006-10-19 devnull while(q->head){
58 6fc7da3c 2006-10-19 devnull e = q->head;
59 6fc7da3c 2006-10-19 devnull q->head = e->next;
60 6fc7da3c 2006-10-19 devnull free(e);
61 6fc7da3c 2006-10-19 devnull }
62 6fc7da3c 2006-10-19 devnull free(q);
63 6fc7da3c 2006-10-19 devnull }
64 6fc7da3c 2006-10-19 devnull
65 056fe1ba 2003-11-23 devnull int
66 056fe1ba 2003-11-23 devnull _vtqsend(Queue *q, void *p)
67 056fe1ba 2003-11-23 devnull {
68 056fe1ba 2003-11-23 devnull Qel *e;
69 056fe1ba 2003-11-23 devnull
70 056fe1ba 2003-11-23 devnull e = vtmalloc(sizeof(Qel));
71 056fe1ba 2003-11-23 devnull qlock(&q->lk);
72 056fe1ba 2003-11-23 devnull if(q->hungup){
73 056fe1ba 2003-11-23 devnull werrstr("hungup queue");
74 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
75 056fe1ba 2003-11-23 devnull return -1;
76 056fe1ba 2003-11-23 devnull }
77 056fe1ba 2003-11-23 devnull e->p = p;
78 056fe1ba 2003-11-23 devnull e->next = nil;
79 056fe1ba 2003-11-23 devnull if(q->head == nil)
80 056fe1ba 2003-11-23 devnull q->head = e;
81 056fe1ba 2003-11-23 devnull else
82 056fe1ba 2003-11-23 devnull q->tail->next = e;
83 056fe1ba 2003-11-23 devnull q->tail = e;
84 056fe1ba 2003-11-23 devnull rwakeup(&q->r);
85 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
86 056fe1ba 2003-11-23 devnull return 0;
87 056fe1ba 2003-11-23 devnull }
88 056fe1ba 2003-11-23 devnull
89 056fe1ba 2003-11-23 devnull void*
90 056fe1ba 2003-11-23 devnull _vtqrecv(Queue *q)
91 056fe1ba 2003-11-23 devnull {
92 056fe1ba 2003-11-23 devnull void *p;
93 056fe1ba 2003-11-23 devnull Qel *e;
94 056fe1ba 2003-11-23 devnull
95 056fe1ba 2003-11-23 devnull qlock(&q->lk);
96 056fe1ba 2003-11-23 devnull while(q->head == nil && !q->hungup)
97 056fe1ba 2003-11-23 devnull rsleep(&q->r);
98 056fe1ba 2003-11-23 devnull if(q->hungup){
99 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
100 056fe1ba 2003-11-23 devnull return nil;
101 056fe1ba 2003-11-23 devnull }
102 056fe1ba 2003-11-23 devnull e = q->head;
103 056fe1ba 2003-11-23 devnull q->head = e->next;
104 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
105 056fe1ba 2003-11-23 devnull p = e->p;
106 056fe1ba 2003-11-23 devnull vtfree(e);
107 056fe1ba 2003-11-23 devnull return p;
108 056fe1ba 2003-11-23 devnull }
109 056fe1ba 2003-11-23 devnull
110 056fe1ba 2003-11-23 devnull void*
111 056fe1ba 2003-11-23 devnull _vtnbqrecv(Queue *q)
112 056fe1ba 2003-11-23 devnull {
113 056fe1ba 2003-11-23 devnull void *p;
114 056fe1ba 2003-11-23 devnull Qel *e;
115 056fe1ba 2003-11-23 devnull
116 056fe1ba 2003-11-23 devnull qlock(&q->lk);
117 056fe1ba 2003-11-23 devnull if(q->head == nil){
118 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
119 056fe1ba 2003-11-23 devnull return nil;
120 056fe1ba 2003-11-23 devnull }
121 056fe1ba 2003-11-23 devnull e = q->head;
122 056fe1ba 2003-11-23 devnull q->head = e->next;
123 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
124 056fe1ba 2003-11-23 devnull p = e->p;
125 056fe1ba 2003-11-23 devnull vtfree(e);
126 056fe1ba 2003-11-23 devnull return p;
127 056fe1ba 2003-11-23 devnull }
128 056fe1ba 2003-11-23 devnull
129 056fe1ba 2003-11-23 devnull void
130 056fe1ba 2003-11-23 devnull _vtqhangup(Queue *q)
131 056fe1ba 2003-11-23 devnull {
132 056fe1ba 2003-11-23 devnull qlock(&q->lk);
133 056fe1ba 2003-11-23 devnull q->hungup = 1;
134 056fe1ba 2003-11-23 devnull rwakeupall(&q->r);
135 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
136 056fe1ba 2003-11-23 devnull }