allow more than one timer to work at a time

This commit is contained in:
Dana Jansens 2003-09-15 03:02:26 +00:00
parent 48d0d42685
commit 0d5d92426f

View file

@ -566,18 +566,25 @@ static gboolean nearest_timeout_wait(ObMainLoop *loop, GTimeVal *tm)
static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait) static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait)
{ {
GSList *it, *next;
gboolean fired = FALSE; gboolean fired = FALSE;
g_get_current_time(&loop->now); g_get_current_time(&loop->now);
while (loop->timers != NULL) { for (it = loop->timers; it; it = next) {
ObMainLoopTimer *curr = loop->timers->data; /* get the top element */ ObMainLoopTimer *curr;
next = g_slist_next(it);
curr = it->data;
/* since timer_stop doesn't actually free the timer, we have to do our /* since timer_stop doesn't actually free the timer, we have to do our
real freeing in here. real freeing in here.
*/ */
if (curr->del_me) { if (curr->del_me) {
/* delete the top */ /* delete the top */
loop->timers = g_slist_delete_link(loop->timers, loop->timers); loop->timers = g_slist_delete_link(loop->timers, it);
g_free(curr); g_free(curr);
continue; continue;
} }
@ -591,7 +598,7 @@ static void timer_dispatch(ObMainLoop *loop, GTimeVal **wait)
then re-insert. timers maintain their order and may trigger more then re-insert. timers maintain their order and may trigger more
than once if they've waited more than one delay's worth of time. than once if they've waited more than one delay's worth of time.
*/ */
loop->timers = g_slist_delete_link(loop->timers, loop->timers); loop->timers = g_slist_delete_link(loop->timers, it);
g_time_val_add(&curr->last, curr->delay); g_time_val_add(&curr->last, curr->delay);
if (curr->func(curr->data)) { if (curr->func(curr->data)) {
g_time_val_add(&curr->timeout, curr->delay); g_time_val_add(&curr->timeout, curr->delay);