queue.c (958B)
1 #include <u.h> 2 #include <libc.h> 3 #include <thread.h> 4 #include <venti.h> 5 #include <diskfs.h> 6 #include "queue.h" 7 8 Queue* 9 qalloc(void) 10 { 11 Queue *q; 12 13 q = vtmallocz(sizeof(Queue)); 14 q->r.l = &q->lk; 15 return q; 16 } 17 18 Block* 19 qread(Queue *q, u32int *pbno) 20 { 21 Block *db; 22 u32int bno; 23 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 } 41 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 } 56 57 void 58 qclose(Queue *q) 59 { 60 qlock(&q->lk); 61 q->closed = 1; 62 rwakeup(&q->r); 63 qunlock(&q->lk); 64 } 65 66 void 67 qfree(Queue *q) 68 { 69 vtfree(q); 70 }