#include #include #include #include "dat.h" #include "fns.h" static Timers TheTimers; Timers* initTimers(void) { Timers *s; s= &TheTimers; s->timer = nil; s->ntimer = 0; s->chan = chancreate(sizeof(int), 0); return s; } Timer* addTimer(Timers *s, char *name) { Timer *t; if (s == nil) return nil; s->timer = realloc(s->timer, sizeof(Timer*)*(s->ntimer+1)); if (s == nil) logfatal(0, "cannot reallocate Timers"); t = malloc(sizeof(Timer)); if (t == nil) logfatal(0, "cannot allocate Timer"); loglog("addTimer %s", name); t->counter = 0; t->name = strdup(name); t->state = Off; s->timer[s->ntimer] = t; s->ntimer++; return t; } void startTimer(Timer *t, int val) { if (t == nil) return; loglog("startTimer %s to %d", t->name, val); if (t->state == Ticking) logall("startTimer oops: %s runs, val=%d", t->name, t->counter/TickPerSec); t->state = Ticking; t->counter = val * TickPerSec; } void resetTimer(Timer *t) { if (t == nil) return; loglog("resetTimer %s (val was %d)", t->name, t->counter/TickPerSec); if (t->state == Off) logall("startTimer oops: %s already off", t->name); t->state = Off; t->counter = 0; } void tickTimer(Timer *t) { if (t == nil) return; if (t->state == Ticking && t->counter > 0) t->counter--; else if (t->state != Ticking) logall("tickTimer oops: %s is not ticking, val=%d", t->name, t->counter/TickPerSec); } int timerVal(Timer *t) { if (t == nil) return -1; return t->counter/TickPerSec; } void tickproc(void *arg) { Timers *s; s = arg; for(;;) { // loglog("tickproc timer=%p ntimer=%d", s->timer, s->ntimer); sleep(Tick); send(s->chan, nil); // was nbsend } }