chiark / gitweb /
Include `crc32.h' for @CRC32@ macro.
[mLib] / sel.c
diff --git a/sel.c b/sel.c
index 1cb6b5db8fd3f8e3ac2a59ce43bdedfdfecf80ae..04d9ed5464cbe959048b4480f4a844bd09e008ab 100644 (file)
--- 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
  *
 /*----- 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 --- *