diff options
-rw-r--r-- | ev.c | 18 |
1 files changed, 12 insertions, 6 deletions
@@ -432,15 +432,16 @@ typedef struct #endif /* Heap Entry */ +#define EV_HEAP_CACHE_AT 0 #if EV_HEAP_CACHE_AT typedef struct { WT w; ev_tstamp at; } ANHE; - #define ANHE_w(he) (he) /* access watcher, read-write */ - #define ANHE_at(he) (he)->at /* acces cahced at, read-only */ - #define ANHE_at_set(he) (he)->at = (he)->w->at /* update at from watcher */ + #define ANHE_w(he) (he).w /* access watcher, read-write */ + #define ANHE_at(he) (he).at /* access cached at, read-only */ + #define ANHE_at_set(he) (he).at = (he).w->at /* update at from watcher */ #else typedef WT ANHE; @@ -1611,6 +1612,7 @@ timers_reify (EV_P) if (ev_at (w) < mn_now) ev_at (w) = mn_now; + ANHE_at_set (timers [HEAP0]); downheap (timers, timercnt, HEAP0); } else @@ -1635,13 +1637,15 @@ periodics_reify (EV_P) { ev_at (w) = w->reschedule_cb (w, ev_rt_now + TIME_EPSILON); assert (("ev_periodic reschedule callback returned time in the past", ev_at (w) > ev_rt_now)); - downheap (periodics, periodiccnt, 1); + ANHE_at_set (periodics [HEAP0]); + downheap (periodics, periodiccnt, HEAP0); } else if (w->interval) { ev_at (w) = w->offset + ceil ((ev_rt_now - w->offset) / w->interval) * w->interval; if (ev_at (w) - ev_rt_now <= TIME_EPSILON) ev_at (w) += w->interval; assert (("ev_periodic timeout in the past detected while processing timers, negative interval?", ev_at (w) > ev_rt_now)); + ANHE_at_set (periodics [HEAP0]); downheap (periodics, periodiccnt, HEAP0); } else @@ -1665,6 +1669,8 @@ periodics_reschedule (EV_P) 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; + + ANHE_at_set (periodics [i]); } /* now rebuild the heap, this for the 2-heap, inefficient for the 4-heap, but correct */ @@ -1987,7 +1993,7 @@ ev_io_stop (EV_P_ ev_io *w) if (expect_false (!ev_is_active (w))) return; - assert (("ev_io_start called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); + assert (("ev_io_stop called with illegal fd (must stay constant after start!)", w->fd >= 0 && w->fd < anfdmax)); wlist_del (&anfds[w->fd].head, (WL)w); ev_stop (EV_A_ (W)w); @@ -2011,7 +2017,7 @@ ev_timer_start (EV_P_ ev_timer *w) ANHE_at_set (timers [ev_active (w)]); upheap (timers, ev_active (w)); - /*assert (("internal timer heap corruption", timers [ev_active (w)] == w));*/ + /*assert (("internal timer heap corruption", timers [ev_active (w)] == (WT)w));*/ } void noinline |