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 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;
20 056fe1ba 2003-11-23 devnull };
21 056fe1ba 2003-11-23 devnull
22 056fe1ba 2003-11-23 devnull Queue*
23 056fe1ba 2003-11-23 devnull _vtqalloc(void)
24 056fe1ba 2003-11-23 devnull {
25 056fe1ba 2003-11-23 devnull Queue *q;
26 056fe1ba 2003-11-23 devnull
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;
30 056fe1ba 2003-11-23 devnull }
31 056fe1ba 2003-11-23 devnull
32 056fe1ba 2003-11-23 devnull int
33 056fe1ba 2003-11-23 devnull _vtqsend(Queue *q, void *p)
34 056fe1ba 2003-11-23 devnull {
35 056fe1ba 2003-11-23 devnull Qel *e;
36 056fe1ba 2003-11-23 devnull
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;
43 056fe1ba 2003-11-23 devnull }
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;
48 056fe1ba 2003-11-23 devnull else
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;
54 056fe1ba 2003-11-23 devnull }
55 056fe1ba 2003-11-23 devnull
56 056fe1ba 2003-11-23 devnull void*
57 056fe1ba 2003-11-23 devnull _vtqrecv(Queue *q)
58 056fe1ba 2003-11-23 devnull {
59 056fe1ba 2003-11-23 devnull void *p;
60 056fe1ba 2003-11-23 devnull Qel *e;
61 056fe1ba 2003-11-23 devnull
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;
68 056fe1ba 2003-11-23 devnull }
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;
75 056fe1ba 2003-11-23 devnull }
76 056fe1ba 2003-11-23 devnull
77 056fe1ba 2003-11-23 devnull void*
78 056fe1ba 2003-11-23 devnull _vtnbqrecv(Queue *q)
79 056fe1ba 2003-11-23 devnull {
80 056fe1ba 2003-11-23 devnull void *p;
81 056fe1ba 2003-11-23 devnull Qel *e;
82 056fe1ba 2003-11-23 devnull
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;
87 056fe1ba 2003-11-23 devnull }
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;
94 056fe1ba 2003-11-23 devnull }
95 056fe1ba 2003-11-23 devnull
96 056fe1ba 2003-11-23 devnull void
97 056fe1ba 2003-11-23 devnull _vtqhangup(Queue *q)
98 056fe1ba 2003-11-23 devnull {
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);
103 056fe1ba 2003-11-23 devnull }