diff options
author | rsc <devnull@localhost> | 2005-07-12 15:23:36 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2005-07-12 15:23:36 +0000 |
commit | a0d146edd7a7de6236a0d60baafeeb59f8452aae (patch) | |
tree | b55baa526d9f5adfc73246e6ee2fadf455e0b7a2 /src/cmd/venti/srv/round.c | |
parent | 88bb285e3d87ec2508840af33f7e0af53ec3c13c (diff) | |
download | plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.gz plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.tar.bz2 plan9port-a0d146edd7a7de6236a0d60baafeeb59f8452aae.zip |
return of venti
Diffstat (limited to 'src/cmd/venti/srv/round.c')
-rw-r--r-- | src/cmd/venti/srv/round.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/cmd/venti/srv/round.c b/src/cmd/venti/srv/round.c new file mode 100644 index 00000000..bbf4a478 --- /dev/null +++ b/src/cmd/venti/srv/round.c @@ -0,0 +1,102 @@ +#include "stdinc.h" +#include "dat.h" +#include "fns.h" + +void +waitforkick(Round *r) +{ + int n; + + qlock(&r->lock); + r->last = r->current; + assert(r->current+1 == r->next); + rwakeupall(&r->finish); + while(!r->doanother) + rsleep(&r->start); + n = r->next++; + r->current = n; + r->doanother = 0; + qunlock(&r->lock); +} + +static void +_kickround(Round *r, int wait) +{ + int n; + + if(!r->doanother) + trace(TraceProc, "kick %s", r->name); + r->doanother = 1; + rwakeup(&r->start); + if(wait){ + n = r->next; + while((int)(n - r->last) > 0){ + r->doanother = 1; + rwakeup(&r->start); + rsleep(&r->finish); + } + } +} + +void +kickround(Round *r, int wait) +{ + qlock(&r->lock); + _kickround(r, wait); + qunlock(&r->lock); +} + +void +initround(Round *r, char *name, int delay) +{ + memset(r, 0, sizeof *r); + r->name = name; + r->start.l = &r->lock; + r->finish.l = &r->lock; + r->delaywait.l = &r->lock; + r->last = 0; + r->current = 0; + r->next = 1; + r->doanother = 0; + r->delaytime = delay; +} + +void +delaykickround(Round *r) +{ + qlock(&r->lock); + r->delaykick = 1; + rwakeup(&r->delaywait); + qunlock(&r->lock); +} + +void +delaykickroundproc(void *v) +{ + Round *r = v; + int n; + + threadsetname("delaykickproc %s", r->name); + qlock(&r->lock); + for(;;){ + while(r->delaykick == 0){ + trace(TraceProc, "sleep"); + rsleep(&r->delaywait); + } + + n = r->next; + qunlock(&r->lock); + + trace(TraceProc, "waitround 0x%ux", (uint)n); + sleep(r->delaytime); + + qlock(&r->lock); + if(n == r->next){ + trace(TraceProc, "kickround 0x%ux", (uint)n); + _kickround(r, 1); + } + + trace(TraceProc, "finishround 0x%ux", (uint)n); + } +} + |