diff options
Diffstat (limited to 'ev.c')
-rw-r--r-- | ev.c | 47 |
1 files changed, 28 insertions, 19 deletions
@@ -68,12 +68,7 @@ get_clock (void) #define array_needsize(base,cur,cnt,init) \ if ((cnt) > cur) \ { \ - int newcnt = cur; \ - do \ - { \ - newcnt += (newcnt >> 1) + 16; \ - } \ - while ((cnt) > newcnt); \ + int newcnt = cur ? cur << 1 : 16; \ fprintf (stderr, "resize(" # base ") from %d to %d\n", cur, newcnt);\ base = realloc (base, sizeof (*base) * (newcnt)); \ init (base + cur, newcnt - cur); \ @@ -161,7 +156,7 @@ downheap (int k) { struct ev_timer *w = timers [k]; - while (k <= (timercnt >> 1)) + while (k < (timercnt >> 1)) { int j = k << 1; @@ -172,7 +167,7 @@ downheap (int k) break; timers [k] = timers [j]; - timers [k]->active = k; + timers [k]->active = k + 1; k = j; } @@ -263,12 +258,13 @@ timer_reify (void) { struct ev_timer *w = timers [0]; + fprintf (stderr, "0 %f, %d c%d\n", w->at, w->active, timercnt);//D /* first reschedule timer */ if (w->repeat) { fprintf (stderr, "a %f now %f repeat %f, %f\n", w->at, ev_now, w->repeat, w->repeat *1e30);//D if (w->is_abs) - w->at += floor ((ev_now - w->at) / w->repeat + 1.) * w->repeat; + w->at += ceil ((ev_now - w->at) / w->repeat + 1.) * w->repeat; else w->at = ev_now + w->repeat; @@ -277,7 +273,10 @@ timer_reify (void) downheap (0); } else + { + fprintf (stderr, "c %f, %d c%d\n", w->at, w->active, timercnt);//D evtimer_stop (w); /* nonrepeating: stop timer */ + } event ((struct ev_watcher *)w, EV_TIMEOUT); } @@ -400,6 +399,7 @@ evtimer_start (struct ev_timer *w) fprintf (stderr, "t1 %f a %d\n", w->at, w->is_abs);//D if (w->is_abs) { + /* this formula differs from the one in timer_reify becuse we do not round up */ if (w->repeat) w->at += ceil ((ev_now - w->at) / w->repeat) * w->repeat; } @@ -416,11 +416,17 @@ evtimer_start (struct ev_timer *w) void evtimer_stop (struct ev_timer *w) { + fprintf (stderr, "-topping %d, %d\n", w->active, timercnt);//D if (!ev_is_active (w)) return; - timers [w->active - 1] = timers [--timercnt]; - downheap (w->active - 1); + fprintf (stderr, "stopping %d, %d\n", w->active, timercnt);//D + if (w->active < timercnt) + { + timers [w->active - 1] = timers [--timercnt]; + downheap (w->active - 1); + } + ev_stop ((struct ev_watcher *)w); } @@ -470,15 +476,18 @@ int main (void) evio_set (&sin, 0, EV_READ); evio_start (&sin); - struct ev_timer t1; - evw_init (&t1, ocb, 1); - evtimer_set_rel (&t1, 1, 0); - evtimer_start (&t1); + struct ev_timer t[1000]; - struct ev_timer t2; - evw_init (&t2, ocb, 2); - evtimer_set_abs (&t2, ev_time () + 2, 0); - evtimer_start (&t2); + int i; + for (i = 0; i < 1000; ++i) + { + struct ev_timer *w = t + i; + evw_init (w, ocb, i); + evtimer_set_rel (w, drand48 (), 0); + evtimer_start (w); + if (drand48 () < 0.5) + evtimer_stop (w); + } ev_loop (0); |