123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #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);
- }
- }
|