URI:
       tqueue.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tqueue.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 }