## diffname port/watchdog.c 2001/0315
## diff -e /dev/null /n/emeliedump/2001/0315/sys/src/9/port/watchdog.c
0a
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "../port/error.h"
#define WDMAGIC 0xfaceface
struct Watchdog
{
Watchdog *next;
ulong magic;
ulong ticks;
void (*f)(int);
ulong arg;
uchar armed;
};
struct {
Lock;
Watchdog *wd;
} wdalloc;
Watchdog*
wdCreate(void)
{
Watchdog *wd;
wd = mallocz(sizeof(Watchdog), 1);
if(wd == nil)
return nil;
wd->magic = WDMAGIC;
return wd;
}
static char*
wdunlink(Watchdog *wd, ulong magic)
{
char *rv;
Watchdog **l;
rv = "not started";
ilock(&wdalloc);
wd->magic = magic;
for(l = &wdalloc.wd; *l != nil; l = &(*l)->next)
if(*l == wd){
*l = wd->next;
rv = nil;
break;
}
wd->armed = 0;
iunlock(&wdalloc);
return rv;
}
char*
wdDelete(Watchdog *wd)
{
if(wd->magic != WDMAGIC)
return "not a watchdog";
wdunlink(wd, ~WDMAGIC);
free(wd);
return nil;
}
char*
wdStart(Watchdog *wd, ulong ms, void (*f)(int), int arg)
{
Watchdog **l;
if(wd->magic != WDMAGIC)
return "not a watchdog";
/* unchain it in case it already is chained */
if(wd->armed)
wdunlink(wd, WDMAGIC);
/* chain the watchdogs in time order */
ilock(&wdalloc);
wd->ticks = MS2TK(ms) + MACHP(0)->ticks;
wd->f = f;
wd->arg = arg;
wd->armed = 1;
for(l = &wdalloc.wd; *l != nil; l = &(*l)->next)
if(wd->ticks < (*l)->ticks)
break;
wd->next = *l;
*l = wd;
iunlock(&wdalloc);
return nil;
}
char*
wdCancel(Watchdog *wd)
{
if(wd->magic != WDMAGIC)
return "not a watchdog";
return wdunlink(wd, WDMAGIC);
}
static void
wdclock(void)
{
Watchdog *wd, **l;
/* find the barking dogs, remoe from the chain */
ilock(&wdalloc);
wd = wdalloc.wd;
for(l = &wdalloc.wd; *l != nil; l = &(*l)->next)
if(MACHP(0)->ticks - (*l)->ticks >= 0x10000000)
break;
if(l == &wdalloc.wd)
wd = nil;
else {
wdalloc.wd = *l;
*l = nil;
}
iunlock(&wdalloc);
/* let them run */
for(; wd != nil; wd = wd->next){
wd->ticks = 0;
wd->armed = 0;
(*wd->f)(wd->arg);
}
}
void
watchdoglink(void)
{
addclock0link(wdclock);
}
.
## diffname port/watchdog.c 2001/0527 # deleted
## diff -e /n/emeliedump/2001/0315/sys/src/9/port/watchdog.c /n/emeliedump/2001/0527/sys/src/9/port/watchdog.c
1,136d
|