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
15 056fe1ba 2003-11-23 devnull int hungup;
16 056fe1ba 2003-11-23 devnull QLock lk;
17 056fe1ba 2003-11-23 devnull Rendez r;
18 056fe1ba 2003-11-23 devnull Qel *head;
19 056fe1ba 2003-11-23 devnull Qel *tail;
23 056fe1ba 2003-11-23 devnull _vtqalloc(void)
25 056fe1ba 2003-11-23 devnull Queue *q;
27 056fe1ba 2003-11-23 devnull q = vtmallocz(sizeof(Queue));
28 056fe1ba 2003-11-23 devnull q->r.l = &q->lk;
29 056fe1ba 2003-11-23 devnull return q;
33 6fc7da3c 2006-10-19 devnull _vtqfree(Queue *q)
37 6fc7da3c 2006-10-19 devnull /* Leaks the pointers e->p! */
38 6fc7da3c 2006-10-19 devnull while(q->head){
39 6fc7da3c 2006-10-19 devnull e = q->head;
40 6fc7da3c 2006-10-19 devnull q->head = e->next;
47 056fe1ba 2003-11-23 devnull _vtqsend(Queue *q, void *p)
51 056fe1ba 2003-11-23 devnull e = vtmalloc(sizeof(Qel));
52 056fe1ba 2003-11-23 devnull qlock(&q->lk);
53 056fe1ba 2003-11-23 devnull if(q->hungup){
54 056fe1ba 2003-11-23 devnull werrstr("hungup queue");
55 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
56 056fe1ba 2003-11-23 devnull return -1;
58 056fe1ba 2003-11-23 devnull e->p = p;
59 056fe1ba 2003-11-23 devnull e->next = nil;
60 056fe1ba 2003-11-23 devnull if(q->head == nil)
61 056fe1ba 2003-11-23 devnull q->head = e;
63 056fe1ba 2003-11-23 devnull q->tail->next = e;
64 056fe1ba 2003-11-23 devnull q->tail = e;
65 056fe1ba 2003-11-23 devnull rwakeup(&q->r);
66 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
67 056fe1ba 2003-11-23 devnull return 0;
71 056fe1ba 2003-11-23 devnull _vtqrecv(Queue *q)
76 056fe1ba 2003-11-23 devnull qlock(&q->lk);
77 056fe1ba 2003-11-23 devnull while(q->head == nil && !q->hungup)
78 056fe1ba 2003-11-23 devnull rsleep(&q->r);
79 056fe1ba 2003-11-23 devnull if(q->hungup){
80 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
81 056fe1ba 2003-11-23 devnull return nil;
83 056fe1ba 2003-11-23 devnull e = q->head;
84 056fe1ba 2003-11-23 devnull q->head = e->next;
85 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
86 056fe1ba 2003-11-23 devnull p = e->p;
87 056fe1ba 2003-11-23 devnull vtfree(e);
88 056fe1ba 2003-11-23 devnull return p;
92 056fe1ba 2003-11-23 devnull _vtnbqrecv(Queue *q)
97 056fe1ba 2003-11-23 devnull qlock(&q->lk);
98 056fe1ba 2003-11-23 devnull if(q->head == nil){
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 _vtqhangup(Queue *q)
113 056fe1ba 2003-11-23 devnull qlock(&q->lk);
114 056fe1ba 2003-11-23 devnull q->hungup = 1;
115 056fe1ba 2003-11-23 devnull rwakeupall(&q->r);
116 056fe1ba 2003-11-23 devnull qunlock(&q->lk);