#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 clockproc(void *arg) { Timers *s; Timer **t; Timer *expired; s = arg; for(;;) { // syslog(0, logname, "clockproc timer=%p ntimer=%d", s->timer, s->ntimer); expired = nil; for (t=&s->timer[0]; t < &s->timer[0] + s->ntimer; t++) { if ((*t)->state == Ticking && (*t)->counter == 0) { syslog(0, logname, "clockproc %s expired", (*t)->name); if (expired != nil) syslog(0, logname, "clockproc multiple timers expire: %s %s", (*t)->name, expired->name); (*t)->state = Expired; expired = *t; } } if (expired != nil) { syslog(0, logname, "clokproc sending on timerchan"); send(s->timerchan, nil); } for (t=&s->timer[0]; t < &s->timer[0] + s->ntimer; t++) { if ((*t)->state == Ticking && (*t)->counter > 0) (*t)->counter--; } sleep(Tick); } }