/* 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 ti_insert(event_timer_t *ti) { event_timer_t *et, **p; for (p = &timers; (et = *p); p = &(et->next)) if (evtime_cmp(&ti->date, &et->date)<0) break; ti->next = et; *p = ti; }
static void ti_insert(struct event_timer *ti) { struct event_timer **p; struct event_timer *t; for (p=&timers; (t = *p); p=&(t->next)) if (evtime_cmp(&ti->date, &t->date)<0) break; ti->next = t; *p = ti; }