]> git.llucax.com Git - software/libev.git/blobdiff - ev.c
make timers best-effort non-drifting
[software/libev.git] / ev.c
diff --git a/ev.c b/ev.c
index 342a0978e1b4021c7c4c05557009a6d80c8dfd61..000c3699256fc6fa3e0d8231e0e79e054d16007c 100644 (file)
--- a/ev.c
+++ b/ev.c
@@ -53,7 +53,7 @@ extern "C" {
 #  define EV_USE_EPOLL 1
 # endif
 
 #  define EV_USE_EPOLL 1
 # endif
 
-# if HAVE_KQUEUE && HAVE_WORKING_KQUEUE && HAVE_SYS_EVENT_H && HAVE_SYS_QUEUE_H
+# if HAVE_KQUEUE && HAVE_SYS_EVENT_H && HAVE_SYS_QUEUE_H
 #  define EV_USE_KQUEUE 1
 # endif
 
 #  define EV_USE_KQUEUE 1
 # endif
 
@@ -989,7 +989,11 @@ timers_reify (EV_P)
       if (w->repeat)
         {
           assert (("negative ev_timer repeat value found while processing timers", w->repeat > 0.));
       if (w->repeat)
         {
           assert (("negative ev_timer repeat value found while processing timers", w->repeat > 0.));
-          ((WT)w)->at = mn_now + w->repeat;
+
+          ((WT)w)->at += w->repeat;
+          if (((WT)w)->at < mn_now)
+            ((WT)w)->at = mn_now;
+
           downheap ((WT *)timers, timercnt, 0);
         }
       else
           downheap ((WT *)timers, timercnt, 0);
         }
       else
@@ -1294,6 +1298,8 @@ ev_io_stop (EV_P_ struct ev_io *w)
   if (!ev_is_active (w))
     return;
 
   if (!ev_is_active (w))
     return;
 
+  assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax));
+
   wlist_del ((WL *)&anfds[w->fd].head, (WL)w);
   ev_stop (EV_A_ (W)w);
 
   wlist_del ((WL *)&anfds[w->fd].head, (WL)w);
   ev_stop (EV_A_ (W)w);
 
@@ -1333,7 +1339,7 @@ ev_timer_stop (EV_P_ struct ev_timer *w)
       downheap ((WT *)timers, timercnt, ((W)w)->active - 1);
     }
 
       downheap ((WT *)timers, timercnt, ((W)w)->active - 1);
     }
 
-  ((WT)w)->at = w->repeat;
+  ((WT)w)->at -= mn_now;
 
   ev_stop (EV_A_ (W)w);
 }
 
   ev_stop (EV_A_ (W)w);
 }