/* timer_fire -- Sends all current timer events. Returns number of milliseconds until next timer event (or a large number) */ int timer_fire(void) { evtime_t now; evtime_now(&now); while (timers && evtime_cmp(&now,&timers->date)>=0) { struct event_timer *ti = timers; at *p = cons(named("timer"), cons(new_gptr(ti), NIL)); timers = ti->next; event_add(ti->handler, p); UNLOCK(p); if (ti->period.sec>0 || ti->period.msec>0) { /* Periodic timer shoot only once per call */ while(evtime_cmp(&now,&ti->date) >= 0) evtime_add(&ti->date,&ti->period,&ti->date); ti_insert(ti); } else { /* One shot timer */ free(ti); } } if (timers) { evtime_t diff; evtime_sub(&timers->date, &now, &diff); if (diff.sec < 24*3600) return diff.sec * 1000 + diff.msec; } return 24*3600*1000; }
static void *timer_add_sub(at *handler, int sec, int msec, int period) { if (handler) { add_notifier(handler, (wr_notify_func_t *)ti_notify, 0); event_timer_t *et = mm_alloc(mt_event_timer); assert(et); et->date.sec = sec; et->date.msec = msec; et->period.sec = period/1000; et->period.msec = period%1000; et->handler = handler; et->next = 0; ti_insert(et); return et; } return 0; }
static void * timer_add_sub(at *handler, int sec, int msec, int period) { struct event_timer *ti; if (handler) { add_finalizer(handler, ti_finalize, 0); if (! (ti = malloc(sizeof(struct event_timer)))) error(NIL,"Out of memory", NIL); ti->date.sec = sec; ti->date.msec = msec; ti->period.sec = period/1000; ti->period.msec = period%1000; ti->handler = handler; ti->next = 0; ti_insert(ti); return ti; } return 0; }