Blame


1 a0d146ed 2005-07-12 devnull #include "stdinc.h"
2 a0d146ed 2005-07-12 devnull #include "dat.h"
3 a0d146ed 2005-07-12 devnull #include "fns.h"
4 a0d146ed 2005-07-12 devnull
5 a0d146ed 2005-07-12 devnull void
6 a0d146ed 2005-07-12 devnull waitforkick(Round *r)
7 a0d146ed 2005-07-12 devnull {
8 a0d146ed 2005-07-12 devnull int n;
9 a0d146ed 2005-07-12 devnull
10 a0d146ed 2005-07-12 devnull qlock(&r->lock);
11 a0d146ed 2005-07-12 devnull r->last = r->current;
12 a0d146ed 2005-07-12 devnull assert(r->current+1 == r->next);
13 a0d146ed 2005-07-12 devnull rwakeupall(&r->finish);
14 a0d146ed 2005-07-12 devnull while(!r->doanother)
15 a0d146ed 2005-07-12 devnull rsleep(&r->start);
16 a0d146ed 2005-07-12 devnull n = r->next++;
17 a0d146ed 2005-07-12 devnull r->current = n;
18 a0d146ed 2005-07-12 devnull r->doanother = 0;
19 a0d146ed 2005-07-12 devnull qunlock(&r->lock);
20 a0d146ed 2005-07-12 devnull }
21 a0d146ed 2005-07-12 devnull
22 a0d146ed 2005-07-12 devnull static void
23 a0d146ed 2005-07-12 devnull _kickround(Round *r, int wait)
24 a0d146ed 2005-07-12 devnull {
25 a0d146ed 2005-07-12 devnull int n;
26 a0d146ed 2005-07-12 devnull
27 a0d146ed 2005-07-12 devnull if(!r->doanother)
28 a0d146ed 2005-07-12 devnull trace(TraceProc, "kick %s", r->name);
29 a0d146ed 2005-07-12 devnull r->doanother = 1;
30 a0d146ed 2005-07-12 devnull rwakeup(&r->start);
31 a0d146ed 2005-07-12 devnull if(wait){
32 a0d146ed 2005-07-12 devnull n = r->next;
33 a0d146ed 2005-07-12 devnull while((int)(n - r->last) > 0){
34 a0d146ed 2005-07-12 devnull r->doanother = 1;
35 a0d146ed 2005-07-12 devnull rwakeup(&r->start);
36 a0d146ed 2005-07-12 devnull rsleep(&r->finish);
37 a0d146ed 2005-07-12 devnull }
38 a0d146ed 2005-07-12 devnull }
39 a0d146ed 2005-07-12 devnull }
40 a0d146ed 2005-07-12 devnull
41 a0d146ed 2005-07-12 devnull void
42 a0d146ed 2005-07-12 devnull kickround(Round *r, int wait)
43 a0d146ed 2005-07-12 devnull {
44 a0d146ed 2005-07-12 devnull qlock(&r->lock);
45 a0d146ed 2005-07-12 devnull _kickround(r, wait);
46 a0d146ed 2005-07-12 devnull qunlock(&r->lock);
47 a0d146ed 2005-07-12 devnull }
48 a0d146ed 2005-07-12 devnull
49 a0d146ed 2005-07-12 devnull void
50 a0d146ed 2005-07-12 devnull initround(Round *r, char *name, int delay)
51 a0d146ed 2005-07-12 devnull {
52 a0d146ed 2005-07-12 devnull memset(r, 0, sizeof *r);
53 a0d146ed 2005-07-12 devnull r->name = name;
54 a0d146ed 2005-07-12 devnull r->start.l = &r->lock;
55 a0d146ed 2005-07-12 devnull r->finish.l = &r->lock;
56 a0d146ed 2005-07-12 devnull r->delaywait.l = &r->lock;
57 a0d146ed 2005-07-12 devnull r->last = 0;
58 a0d146ed 2005-07-12 devnull r->current = 0;
59 a0d146ed 2005-07-12 devnull r->next = 1;
60 a0d146ed 2005-07-12 devnull r->doanother = 0;
61 a0d146ed 2005-07-12 devnull r->delaytime = delay;
62 a0d146ed 2005-07-12 devnull }
63 a0d146ed 2005-07-12 devnull
64 a0d146ed 2005-07-12 devnull void
65 a0d146ed 2005-07-12 devnull delaykickround(Round *r)
66 a0d146ed 2005-07-12 devnull {
67 a0d146ed 2005-07-12 devnull qlock(&r->lock);
68 a0d146ed 2005-07-12 devnull r->delaykick = 1;
69 a0d146ed 2005-07-12 devnull rwakeup(&r->delaywait);
70 a0d146ed 2005-07-12 devnull qunlock(&r->lock);
71 a0d146ed 2005-07-12 devnull }
72 a0d146ed 2005-07-12 devnull
73 a0d146ed 2005-07-12 devnull void
74 a0d146ed 2005-07-12 devnull delaykickroundproc(void *v)
75 a0d146ed 2005-07-12 devnull {
76 a0d146ed 2005-07-12 devnull Round *r = v;
77 a0d146ed 2005-07-12 devnull int n;
78 a0d146ed 2005-07-12 devnull
79 a0d146ed 2005-07-12 devnull threadsetname("delaykickproc %s", r->name);
80 a0d146ed 2005-07-12 devnull qlock(&r->lock);
81 a0d146ed 2005-07-12 devnull for(;;){
82 a0d146ed 2005-07-12 devnull while(r->delaykick == 0){
83 a0d146ed 2005-07-12 devnull trace(TraceProc, "sleep");
84 a0d146ed 2005-07-12 devnull rsleep(&r->delaywait);
85 a0d146ed 2005-07-12 devnull }
86 a0d146ed 2005-07-12 devnull
87 a0d146ed 2005-07-12 devnull n = r->next;
88 a0d146ed 2005-07-12 devnull qunlock(&r->lock);
89 a0d146ed 2005-07-12 devnull
90 a0d146ed 2005-07-12 devnull trace(TraceProc, "waitround 0x%ux", (uint)n);
91 a0d146ed 2005-07-12 devnull sleep(r->delaytime);
92 a0d146ed 2005-07-12 devnull
93 a0d146ed 2005-07-12 devnull qlock(&r->lock);
94 a0d146ed 2005-07-12 devnull if(n == r->next){
95 a0d146ed 2005-07-12 devnull trace(TraceProc, "kickround 0x%ux", (uint)n);
96 a0d146ed 2005-07-12 devnull _kickround(r, 1);
97 a0d146ed 2005-07-12 devnull }
98 a0d146ed 2005-07-12 devnull
99 a0d146ed 2005-07-12 devnull trace(TraceProc, "finishround 0x%ux", (uint)n);
100 a0d146ed 2005-07-12 devnull }
101 a0d146ed 2005-07-12 devnull }