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"
6 056fe1ba 2003-11-23 devnull typedef struct Qel Qel;
7 056fe1ba 2003-11-23 devnull struct Qel
9 056fe1ba 2003-11-23 devnull Qel *next;
13 056fe1ba 2003-11-23 devnull struct Queue
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;
24 056fe1ba 2003-11-23 devnull _vtqalloc(void)
26 056fe1ba 2003-11-23 devnull Queue *q;
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;
35 4f6d2bb1 2007-04-08 devnull _vtqincref(Queue *q)
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;
44 4f6d2bb1 2007-04-08 devnull _vtqdecref(Queue *q)
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);
53 4f6d2bb1 2007-04-08 devnull assert(q->ref == 0);
54 4f6d2bb1 2007-04-08 devnull qunlock(&q->lk);
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;
66 056fe1ba 2003-11-23 devnull _vtqsend(Queue *q, void *p)
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;
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;
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;
90 056fe1ba 2003-11-23 devnull _vtqrecv(Queue *q)
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;
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;
111 056fe1ba 2003-11-23 devnull _vtnbqrecv(Queue *q)
113 056fe1ba 2003-11-23 devnull void *p;
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;
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;
130 056fe1ba 2003-11-23 devnull _vtqhangup(Queue *q)
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);