X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/5e1ded7d0e003d14aba927358604fcb49c4aa7b5..0ae5e7b3fd62e0251d21f3abbc187f4c7585f85f:/sel.c diff --git a/sel.c b/sel.c index 1cb6b5d..04d9ed5 100644 --- a/sel.c +++ b/sel.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sel.c,v 1.6 1999/09/26 14:28:11 mdw Exp $ + * $Id: sel.c,v 1.8 2000/03/23 20:42:08 mdw Exp $ * * I/O multiplexing support * @@ -30,6 +30,12 @@ /*----- 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. + * * Revision 1.6 1999/09/26 14:28:11 mdw * (sel_select): Almost pointless efficiency tweak. * @@ -272,7 +278,7 @@ void sel_rmhook(sel_hook *h) } /* --- @sel_fdmerge@ --- * - * + * * Arguments: @fd_set *dest@ = destination FD set * @fd_set *fd@ = pointer to set to merge * @int maxfd@ = highest numbered descriptor in @fd@ + 1 @@ -371,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 --- *