void gw_timer_start(Timer *timer, int interval, void *data) { int wakeup = 0; gw_assert(timer != NULL); if (timer == NULL) return; lock(timer->timerset); /* Convert to absolute time */ interval += time(NULL); if (timer->elapses > 0) { /* Resetting an existing timer. Move it to its new * position in the heap. */ if (interval < timer->elapses && timer->index == 0) wakeup = 1; timer->elapses = interval; gw_assert(timer->index >= 0); gw_assert(timer->timerset->heap->tab[timer->index] == timer); wakeup |= heap_adjust(timer->timerset->heap, timer->index); } else { /* Setting a new timer, or resetting an elapsed one. * First deal with a possible elapse event that may * still be on the output list. */ abort_elapsed(timer); /* Then activate the timer. */ timer->elapses = interval; gw_assert(timer->index < 0); heap_insert(timer->timerset->heap, timer); wakeup = timer->index == 0; /* Do we have a new top? */ } if (data != NULL) { timer->data = data; } unlock(timer->timerset); if (wakeup) gwthread_wakeup(timer->timerset->thread); }
void gwtimer_start(Timer *timer, int interval, WAPEvent *event) { int wakeup = 0; gw_assert(initialized); gw_assert(timer != NULL); gw_assert(event != NULL || timer->event != NULL); lock(timers); /* Convert to absolute time */ interval += time(NULL); if (timer->elapses > 0) { /* Resetting an existing timer. Move it to its new * position in the heap. */ if (interval < timer->elapses && timer->index == 0) wakeup = 1; timer->elapses = interval; gw_assert(timers->heap->tab[timer->index] == timer); wakeup |= heap_adjust(timers->heap, timer->index); } else { /* Setting a new timer, or resetting an elapsed one. * First deal with a possible elapse event that may * still be on the output list. */ abort_elapsed(timer); /* Then activate the timer. */ timer->elapses = interval; gw_assert(timer->index < 0); heap_insert(timers->heap, timer); wakeup = timer->index == 0; /* Do we have a new top? */ } if (event != NULL) { wap_event_destroy(timer->event); timer->event = event; } unlock(timers); if (wakeup) gwthread_wakeup(timers->thread); }
void gw_timer_stop(Timer *timer) { gw_assert(timer != NULL); lock(timer->timerset); /* * If the timer is active, make it inactive and remove it from * the heap. */ if (timer->elapses > 0) { timer->elapses = -1; gw_assert(timer->timerset->heap->tab[timer->index] == timer); heap_delete(timer->timerset->heap, timer->index); } abort_elapsed(timer); unlock(timer->timerset); }
List *gw_timer_break(Timerset *set) { List *ret = NULL; lock(set); if (set->heap->len == 0) { unlock(set); return NULL; } ret = gwlist_create(); /* Stop all timers. */ while (set->heap->len > 0) { Timer *timer = set->heap->tab[0]; gwlist_append(ret, timer); /* * If the timer is active, make it inactive and remove it from * the heap. */ if (timer->elapses > 0) { timer->elapses = -1; gw_assert(set->heap->tab[timer->index] == timer); heap_delete(set->heap, timer->index); } abort_elapsed(timer); } unlock(set); return ret; }