]> 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 77e80116e686916993395f271ea9015cc735c523..000c3699256fc6fa3e0d8231e0e79e054d16007c 100644 (file)
--- a/ev.c
+++ b/ev.c
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #ifndef EV_STANDALONE
 # include "config.h"
 
 #ifndef EV_STANDALONE
 # include "config.h"
 
@@ -48,7 +53,7 @@
 #  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
 
@@ -223,6 +228,7 @@ typedef struct
 
   struct ev_loop
   {
 
   struct ev_loop
   {
+    ev_tstamp ev_rt_now;
     #define VAR(name,decl) decl;
       #include "ev_vars.h"
     #undef VAR
     #define VAR(name,decl) decl;
       #include "ev_vars.h"
     #undef VAR
@@ -234,6 +240,7 @@ typedef struct
 
 #else
 
 
 #else
 
+  ev_tstamp ev_rt_now;
   #define VAR(name,decl) static decl;
     #include "ev_vars.h"
   #undef VAR
   #define VAR(name,decl) static decl;
     #include "ev_vars.h"
   #undef VAR
@@ -982,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
@@ -1287,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);
 
@@ -1326,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);
 }
@@ -1594,3 +1607,7 @@ ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, vo
     }
 }
 
     }
 }
 
+#ifdef __cplusplus
+}
+#endif
+