plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }