diff options
| author | rsc <devnull@localhost> | 2005-07-13 03:49:41 +0000 |
|---|---|---|
| committer | rsc <devnull@localhost> | 2005-07-13 03:49:41 +0000 |
| commit | 004aa293f360ea0f63ec50f5042f8c0fb2831e4f (patch) | |
| tree | d44b801b47c82861d68d4045acf0bf7129ce6009 /src/cmd/vbackup/queue.c | |
| parent | 0c98da8bf8ea51d0288222f6c6ba3c125cf20f46 (diff) | |
Dump-like file system backup for Unix, built on Venti.
Diffstat (limited to 'src/cmd/vbackup/queue.c')
| -rw-r--r-- | src/cmd/vbackup/queue.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/cmd/vbackup/queue.c b/src/cmd/vbackup/queue.c new file mode 100644 index 00000000..91fa221d --- /dev/null +++ b/src/cmd/vbackup/queue.c @@ -0,0 +1,64 @@ +#include <u.h> +#include <libc.h> +#include <thread.h> +#include <venti.h> +#include <diskfs.h> +#include "queue.h" + +Queue* +qalloc(void) +{ + Queue *q; + + q = vtmallocz(sizeof(Queue)); + q->r.l = &q->lk; + return q; +} + +Block* +qread(Queue *q, u32int *pbno) +{ + Block *db; + u32int bno; + + qlock(&q->lk); + while(q->nel == 0 && !q->closed) + rsleep(&q->r); + if(q->nel == 0 && q->closed){ + qunlock(&q->lk); + return nil; + } + db = q->el[q->ri].db; + bno = q->el[q->ri].bno; + if(++q->ri == MAXQ) + q->ri = 0; + if(q->nel-- == MAXQ/2) + rwakeup(&q->r); + qunlock(&q->lk); + *pbno = bno; + return db; +} + +void +qwrite(Queue *q, Block *db, u32int bno) +{ + qlock(&q->lk); + while(q->nel == MAXQ) + rsleep(&q->r); + q->el[q->wi].db = db; + q->el[q->wi].bno = bno; + if(++q->wi == MAXQ) + q->wi = 0; + if(q->nel++ == MAXQ/2) + rwakeup(&q->r); + qunlock(&q->lk); +} + +void +qclose(Queue *q) +{ + qlock(&q->lk); + q->closed = 1; + rwakeup(&q->r); + qunlock(&q->lk); +} |