Blame


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