/* -*-c-*-
*
- * $Id: sel.c,v 1.10 2001/06/22 19:35:58 mdw Exp $
+ * $Id: sel.c,v 1.12 2003/05/18 15:10:29 mdw Exp $
*
* I/O multiplexing support
*
/*----- Revision history --------------------------------------------------*
*
* $Log: sel.c,v $
+ * Revision 1.12 2003/05/18 15:10:29 mdw
+ * Remove memory leak.
+ *
+ * Revision 1.11 2003/05/17 10:34:04 mdw
+ * Tidying and bugfixing.
+ *
* Revision 1.10 2001/06/22 19:35:58 mdw
* Fix a large number of bugs.
*
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);
}
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);
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;
}
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;
}
}
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;
}
{
if (h->next)
h->next->prev = h->prev;
- h->prev->next = h->next;
+ *h->prev = h->next;
}
/* --- @sel_fdmerge@ --- *
}
*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) {
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);
}
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);
}
}
}