#include <u.h>
#include <libc.h>
#include <thread.h>
#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
}
}
|