X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/1101f87ace7e0b3be886220d4faa13954fd35c6b..0ae5e7b3fd62e0251d21f3abbc187f4c7585f85f:/sel.c diff --git a/sel.c b/sel.c index a9dd4cf..04d9ed5 100644 --- a/sel.c +++ b/sel.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sel.c,v 1.5 1999/08/31 17:42:22 mdw Exp $ + * $Id: sel.c,v 1.8 2000/03/23 20:42:08 mdw Exp $ * * I/O multiplexing support * @@ -30,6 +30,15 @@ /*----- 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. + * * Revision 1.5 1999/08/31 17:42:22 mdw * New function `sel_force' to force a descriptor to be `selected'. * @@ -269,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 @@ -368,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 --- * @@ -394,8 +407,8 @@ int sel_select(sel_state *s) sel_file *f, *ff; for (f = s->files[i]; f; f = ff) { ff = f->next; - if (FD_ISSET(f->fd, a.fd + f->mode)) - f->func(f->fd, f->mode, f->p); + if (FD_ISSET(f->fd, a.fd + i)) + f->func(f->fd, i, f->p); } } }