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 056fe1ba 2003-11-23 devnull _vtqsend(Queue *q, void *p)
37 056fe1ba 2003-11-23 devnull e = vtmalloc(sizeof(Qel));
38 056fe1ba 2003-11-23 devnull qlock(&q->lk);
39 056fe1ba 2003-11-23 devnull if(q->hungup){
40 056fe1ba 2003-11-23 devnull werrstr("hungup queue");
41 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
42 056fe1ba 2003-11-23 devnull return -1;
44 056fe1ba 2003-11-23 devnull e->p = p;
45 056fe1ba 2003-11-23 devnull e->next = nil;
46 056fe1ba 2003-11-23 devnull if(q->head == nil)
47 056fe1ba 2003-11-23 devnull q->head = e;
49 056fe1ba 2003-11-23 devnull q->tail->next = e;
50 056fe1ba 2003-11-23 devnull q->tail = e;
51 056fe1ba 2003-11-23 devnull rwakeup(&q->r);
52 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
53 056fe1ba 2003-11-23 devnull return 0;
57 056fe1ba 2003-11-23 devnull _vtqrecv(Queue *q)
62 056fe1ba 2003-11-23 devnull qlock(&q->lk);
63 056fe1ba 2003-11-23 devnull while(q->head == nil && !q->hungup)
64 056fe1ba 2003-11-23 devnull rsleep(&q->r);
65 056fe1ba 2003-11-23 devnull if(q->hungup){
66 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
67 056fe1ba 2003-11-23 devnull return nil;
69 056fe1ba 2003-11-23 devnull e = q->head;
70 056fe1ba 2003-11-23 devnull q->head = e->next;
71 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
72 056fe1ba 2003-11-23 devnull p = e->p;
73 056fe1ba 2003-11-23 devnull vtfree(e);
74 056fe1ba 2003-11-23 devnull return p;
78 056fe1ba 2003-11-23 devnull _vtnbqrecv(Queue *q)
83 056fe1ba 2003-11-23 devnull qlock(&q->lk);
84 056fe1ba 2003-11-23 devnull if(q->head == nil){
85 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
86 056fe1ba 2003-11-23 devnull return nil;
88 056fe1ba 2003-11-23 devnull e = q->head;
89 056fe1ba 2003-11-23 devnull q->head = e->next;
90 056fe1ba 2003-11-23 devnull qunlock(&q->lk);
91 056fe1ba 2003-11-23 devnull p = e->p;
92 056fe1ba 2003-11-23 devnull vtfree(e);
93 056fe1ba 2003-11-23 devnull return p;
97 056fe1ba 2003-11-23 devnull _vtqhangup(Queue *q)
99 056fe1ba 2003-11-23 devnull qlock(&q->lk);
100 056fe1ba 2003-11-23 devnull q->hungup = 1;
101 056fe1ba 2003-11-23 devnull rwakeupall(&q->r);
102 056fe1ba 2003-11-23 devnull qunlock(&q->lk);