#include #include #include #include #include #include #include #include #include "dat.h" #include "fns.h" void initTimers(Timers *s) { if (s == nil) return; s->timer = nil; s->ntimer = 0; s->timerchan = chancreate(sizeof(int), 0); } 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) sysfatal("cannot reallocate Timers"); t = malloc(sizeof(Timer)); if (t == nil) sysfatal("cannot allocate Timer"); syslog(0, logname, "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; syslog(0, logname, "startTimer %s to %d", t->name, val); if (t->state == Ticking) syslog(0, logname, "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; syslog(0, logname, "resetTimer %s (val was %d)", t->name, t->counter/TickPerSec); if (t->state == Off) syslog(0, logname, "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) syslog(0, logname, "tickTimer oops: %s is not ticking, val=%d", t->name, t->counter/TickPerSec); } void clockproc(void *arg) { Timers *s; s = arg; for(;;) { // syslog(0, logname, "clockproc timer=%p ntimer=%d", s->timer, s->ntimer); sleep(Tick); nbsend(s->timerchan, nil); } }