#include #include #include #include "include/log.h" #include "include/list.h" #include "include/timer.h" #include "include/ucix.h" /* when using this file, alarm() is used */ static struct list_head timers; struct timer { struct list_head list; int count; int timeout; timercb_t timercb; }; void timer_add(timercb_t timercb, int timeout) { struct timer *timer; timer = malloc(sizeof(struct timer)); if(!timer) { log_printf("unable to get timer buffer\n"); return; } timer->count = 0; timer->timeout = timeout; timer->timercb = timercb; INIT_LIST_HEAD(&timer->list); list_add(&timer->list, &timers); } static void timer_proc(int signo) { struct list_head *p; list_for_each(p, &timers) { struct timer *q = container_of(p, struct timer, list); q->count++; if(!(q->count%q->timeout)) { q->timercb(); } } alarm(1); } void timer_init(void) { struct sigaction s; INIT_LIST_HEAD(&timers); s.sa_handler = timer_proc; s.sa_flags = 0; sigaction(SIGALRM, &s, NULL); alarm(1); }