X-Git-Url: https://git.llucax.com/software/libev.git/blobdiff_plain/54ae3adf55df78d268cd7f1633f5e7d44f687db2..f0e9f4e4e09ba9877ac4d15fefde761cc96cd317:/ev.c diff --git a/ev.c b/ev.c index 20ad7e4..14046a2 100644 --- a/ev.c +++ b/ev.c @@ -520,6 +520,18 @@ downheap (WT *heap, int N, int k) ((W)heap [k])->active = k + 1; } +inline void +adjustheap (WT *heap, int N, int k, ev_tstamp at) +{ + ev_tstamp old_at = heap [k]->at; + heap [k]->at = at; + + if (old_at < at) + downheap (heap, N, k); + else + upheap (heap, k); +} + /*****************************************************************************/ typedef struct @@ -753,7 +765,7 @@ loop_init (EV_P_ int methods) if (!method && (methods & EVMETHOD_SELECT)) method = select_init (EV_A_ methods); #endif - ev_watcher_init (&sigev, sigcb); + ev_init (&sigev, sigcb); ev_set_priority (&sigev, EV_MAXPRI); } } @@ -950,7 +962,7 @@ call_pending (EV_P) if (p->w) { p->w->pending = 0; - p->w->cb (EV_A_ p->w, p->events); + EV_CB_INVOKE (p->w, p->events); } } } @@ -1323,10 +1335,7 @@ ev_timer_again (EV_P_ struct ev_timer *w) if (ev_is_active (w)) { if (w->repeat) - { - ((WT)w)->at = mn_now + w->repeat; - downheap ((WT *)timers, timercnt, ((W)w)->active - 1); - } + adjustheap ((WT *)timers, timercnt, ((W)w)->active - 1, mn_now + w->repeat); else ev_timer_stop (EV_A_ w); } @@ -1378,6 +1387,7 @@ ev_periodic_stop (EV_P_ struct ev_periodic *w) void ev_periodic_again (EV_P_ struct ev_periodic *w) { + /* TODO: use adjustheap and recalculation */ ev_periodic_stop (EV_A_ w); ev_periodic_start (EV_A_ w); } @@ -1566,14 +1576,14 @@ ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, vo once->cb = cb; once->arg = arg; - ev_watcher_init (&once->io, once_cb_io); + ev_init (&once->io, once_cb_io); if (fd >= 0) { ev_io_set (&once->io, fd, events); ev_io_start (EV_A_ &once->io); } - ev_watcher_init (&once->to, once_cb_to); + ev_init (&once->to, once_cb_to); if (timeout >= 0.) { ev_timer_set (&once->to, timeout, 0.);