diff options
author | root <root> | 2011-01-30 19:05:40 +0000 |
---|---|---|
committer | root <root> | 2011-01-30 19:05:40 +0000 |
commit | b784cc4c85f636b48e048ab2e3e3aab4c6f1ba0e (patch) | |
tree | 43ff3dfa776ee801f0c1af009955435f040b068f /ev.c | |
parent | 4589d9abef4dfb57d31250e310d23264be287e70 (diff) |
periodic_recalc, hpux
Diffstat (limited to 'ev.c')
-rw-r--r-- | ev.c | 20 |
1 files changed, 15 insertions, 5 deletions
@@ -378,7 +378,8 @@ EV_CPP(extern "C" {) #endif #if !EV_USE_NANOSLEEP -# ifndef _WIN32 +/* hp-ux has it in sys/time.h, which we unconditionally include above */ +# if !defined(_WIN32) && !defined(__hpux) # include <sys/select.h> # endif #endif @@ -2193,6 +2194,15 @@ timers_reify (EV_P) } #if EV_PERIODIC_ENABLE + +inline_speed +periodic_recalc (EV_P_ ev_periodic *w) +{ + /* TODO: use slow but potentially more correct incremental algo, */ + /* also do not rely on ceil */ + ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval; +} + /* make periodics pending */ inline_size void periodics_reify (EV_P) @@ -2221,7 +2231,8 @@ periodics_reify (EV_P) } else if (w->interval) { - ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval; + periodic_recalc (EV_A_ w); + /* if next trigger time is not sufficiently in the future, put it there */ /* this might happen because of floating point inexactness */ if (ev_at (w) - ev_rt_now < TIME_EPSILON) @@ -2265,7 +2276,7 @@ periodics_reschedule (EV_P) if (w->reschedule_cb) ev_at (w) = w->reschedule_cb (w, ev_rt_now); else if (w->interval) - ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval; + periodic_recalc (EV_A_ w); ANHE_at_cache (periodics [i]); } @@ -2767,8 +2778,7 @@ ev_periodic_start (EV_P_ ev_periodic *w) else if (w->interval) { assert (("libev: ev_periodic_start called with negative interval value", w->interval >= 0.)); - /* this formula differs from the one in periodic_reify because we do not always round up */ - ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval; + periodic_recalc (EV_A_ w); } else ev_at (w) = w->offset; |