#include <u.h>
#include <libc.h>
#include <thread.h>
#include <bio.h>
#include <ip.h>
#include <mp.h>
#include <libsec.h>
#include <auth.h>
#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);
}
}
|