X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/blobdiff_plain/0a2a19b4356ad08c670a00fee4ee72b08cfe328c..76a7638e4b77ace1b96e1399f8a11e09fb3afede:/sel.c?ds=inline diff --git a/sel.c b/sel.c index 1e3cdac..5dede9b 100644 --- a/sel.c +++ b/sel.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: sel.c,v 1.10 2001/06/22 19:35:58 mdw Exp $ + * $Id: sel.c,v 1.13 2004/04/08 01:36:13 mdw Exp $ * * I/O multiplexing support * @@ -27,42 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: sel.c,v $ - * Revision 1.10 2001/06/22 19:35:58 mdw - * Fix a large number of bugs. - * - * Revision 1.9 2001/02/03 19:07:08 mdw - * Ensure that timers set to go off in the past don't case a problem. - * - * 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'. - * - * Revision 1.4 1999/08/19 18:30:26 mdw - * Implement hooks for foreign select-using systems (currently not well - * tested). - * - * Revision 1.3 1999/05/21 22:13:59 mdw - * Use new `tv' macros. Fix ordering bug for timeout selectors. - * - * Revision 1.2 1999/05/15 10:33:32 mdw - * Fix copyright notices. - * - * Revision 1.1 1999/05/14 21:01:14 mdw - * Integrated `select' handling bits from the background resolver project. - * - */ - /*----- Header files ------------------------------------------------------*/ #include @@ -161,9 +125,9 @@ void sel_addfile(sel_file *f) while (*ff && (*ff)->fd > f->fd) ff = &(*ff)->next; f->next = *ff; - f->prev = (sel_file *)ff; + f->prev = ff; if (*ff) - (*ff)->prev = f; + (*ff)->prev = &f->next; *ff = f; FD_SET(f->fd, f->s->fd + f->mode); } @@ -197,7 +161,7 @@ void sel_force(sel_file *f) void sel_rmfile(sel_file *f) { - f->prev->next = f->next; + *f->prev = f->next; if (f->next) f->next->prev = f->prev; FD_CLR(f->fd, f->s->fd + f->mode); @@ -240,9 +204,9 @@ void sel_addtimer(sel_state *s, sel_timer *t, while (*tt && TV_CMP(&(*tt)->tv, <, tv)) tt = &(*tt)->next; t->next = *tt; - t->prev = (sel_timer *)tt; + t->prev = tt; if (*tt) - (*tt)->prev = t; + (*tt)->prev = &t->next; *tt = t; } @@ -257,12 +221,13 @@ void sel_addtimer(sel_state *s, sel_timer *t, void sel_rmtimer(sel_timer *t) { - t->prev->next = t->next; - if (t->next) - t->next->prev = t->prev; if (t->pend) { t->pend->t = 0; t->pend = 0; + } else { + *t->prev = t->next; + if (t->next) + t->next->prev = t->prev; } } @@ -286,9 +251,9 @@ void sel_addhook(sel_state *s, sel_hook *h, h->after = after; h->p = p; h->next = s->hooks; - h->prev = (sel_hook *)&s->hooks; + h->prev = &s->hooks; if (s->hooks) - s->hooks->prev = h; + s->hooks->prev = &h->next; s->hooks = h; } @@ -305,7 +270,7 @@ void sel_rmhook(sel_hook *h) { if (h->next) h->next->prev = h->prev; - h->prev->next = h->next; + *h->prev = h->next; } /* --- @sel_fdmerge@ --- * @@ -426,8 +391,8 @@ int sel_select(sel_state *s) } *ptt = 0; if (t) { - t->prev->next = 0; - t->prev = (sel_timer *)&s->timers; + *t->prev = 0; + t->prev = &s->timers; } s->timers = t; while (pthead) { @@ -435,8 +400,10 @@ int sel_select(sel_state *s) pthead = pt->next; t = pt->t; if (t) { - t->func(&a.now, t->p); t->pend = 0; + t->next = 0; + t->prev = &t->next; + t->func(&a.now, t->p); } DESTROY(pt); } @@ -471,9 +438,10 @@ int sel_select(sel_state *s) pfhead = pf->next; f = pf->f; if (f) { - f->func(f->fd, i, f->p); f->pend = 0; + f->func(f->fd, i, f->p); } + DESTROY(pf); } } }