chiark / gitweb /
Fix generating tables where the chunk size is longer than the
[mLib] / sel.c
diff --git a/sel.c b/sel.c
index 55b599089222ae895dbbde04249821ab7b3b297a..62a61cfc9f5eafdb8858c88ff7eab50c6690f0ad 100644 (file)
--- a/sel.c
+++ b/sel.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: sel.c,v 1.7 1999/12/11 11:12:17 mdw Exp $
+ * $Id: sel.c,v 1.9 2001/02/03 19:07:08 mdw Exp $
  *
  * I/O multiplexing support
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: sel.c,v $
+ * 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.
  *
@@ -331,7 +337,12 @@ int sel_select(sel_state *s)
   if (!s->timers)
     a.tvp = 0;
   else {
-    TV_SUB(&a.tv, &s->timers->tv, &a.now);
+    if (TV_CMP(&s->timers->tv, >, &a.now))
+      TV_SUB(&a.tv, &s->timers->tv, &a.now);
+    else {
+      a.tv.tv_sec = 0;
+      a.tv.tv_usec = 0;
+    }
     a.tvp = &a.tv;
   }
   s->args = &a;
@@ -374,16 +385,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 --- *