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 void43 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 void58 qclose(Queue *q)59 {60 qlock(&q->lk);61 q->closed = 1;62 rwakeup(&q->r);63 qunlock(&q->lk);64 }66 void67 qfree(Queue *q)68 {69 vtfree(q);70 }