X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/932341d9970e779c2116e6c2b0a1087943712a96..d0053e2e04b82ba280e6bffb9168ae9468eb9788:/sel.c diff --git a/sel.c b/sel.c index 55b5990..04d9ed5 100644 --- a/sel.c +++ b/sel.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sel.c,v 1.7 1999/12/11 11:12:17 mdw Exp $ + * $Id: sel.c,v 1.8 2000/03/23 20:42:08 mdw Exp $ * * I/O multiplexing support * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: sel.c,v $ + * Revision 1.8 2000/03/23 20:42:08 mdw + * Rearrange timeout handling to avoid list corruptions. + * * Revision 1.7 1999/12/11 11:12:17 mdw * Fix comment formatting error. * @@ -374,16 +377,20 @@ int sel_select(sel_state *s) /* --- Run through the timers --- */ - { + if (s->timers && TV_CMP(&s->timers->tv, <=, &a.now)) { sel_timer *t, *tt; - for (t = s->timers; t && TV_CMP(&t->tv, <=, &a.now); t = tt) { + tt = s->timers; + for (t = tt; t && TV_CMP(&t->tv, <=, &a.now); t = t->next) + ; + if (t) { + t->prev->next = 0; + t->prev = (sel_timer *)&s->timers; + } + s->timers = t; + for (t = tt; t; t = tt) { tt = t->next; - t->next = t->prev = t; t->func(&a.now, t->p); } - s->timers = t; - if (t) - t->prev = (sel_timer *)&s->timers; } /* --- And finally run through the files --- *