Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
4 #include <venti.h>
5 #include <diskfs.h>
6 #include "queue.h"
8 Queue*
9 qalloc(void)
10 {
11 Queue *q;
13 q = vtmallocz(sizeof(Queue));
14 q->r.l = &q->lk;
15 return q;
16 }
18 Block*
19 qread(Queue *q, u32int *pbno)
20 {
21 Block *db;
22 u32int bno;
24 qlock(&q->lk);
25 while(q->nel == 0 && !q->closed)
26 rsleep(&q->r);
27 if(q->nel == 0 && q->closed){
28 qunlock(&q->lk);
29 return nil;
30 }
31 db = q->el[q->ri].db;
32 bno = q->el[q->ri].bno;
33 if(++q->ri == MAXQ)
34 q->ri = 0;
35 if(q->nel-- == MAXQ/2)
36 rwakeup(&q->r);
37 qunlock(&q->lk);
38 *pbno = bno;
39 return db;
40 }
42 void
43 qwrite(Queue *q, Block *db, u32int bno)
44 {
45 qlock(&q->lk);
46 while(q->nel == MAXQ)
47 rsleep(&q->r);
48 q->el[q->wi].db = db;
49 q->el[q->wi].bno = bno;
50 if(++q->wi == MAXQ)
51 q->wi = 0;
52 if(q->nel++ == MAXQ/2)
53 rwakeup(&q->r);
54 qunlock(&q->lk);
55 }
57 void
58 qclose(Queue *q)
59 {
60 qlock(&q->lk);
61 q->closed = 1;
62 rwakeup(&q->r);
63 qunlock(&q->lk);
64 }
66 void
67 qfree(Queue *q)
68 {
69 vtfree(q);
70 }