--- embedaddon/lighttpd/src/fdevent_libev.c 2014/06/15 20:20:06 1.1.1.2 +++ embedaddon/lighttpd/src/fdevent_libev.c 2016/11/02 10:35:00 1.1.1.3 @@ -1,3 +1,5 @@ +#include "first.h" + #include "fdevent.h" #include "buffer.h" #include "log.h" @@ -87,29 +89,16 @@ static void timeout_watcher_cb(struct ev_loop *loop, e UNUSED(loop); UNUSED(w); UNUSED(revents); - - ev_timer_stop(loop, w); } +static ev_timer timeout_watcher; static int fdevent_libev_poll(fdevents *ev, int timeout_ms) { - union { - struct ev_watcher w; - struct ev_timer timer; - } timeout_watcher; + timeout_watcher.repeat = (timeout_ms > 0) ? timeout_ms/1000.0 : 0.001; - if (!timeout_ms) timeout_ms = 1; + ev_timer_again(ev->libev_loop, &timeout_watcher); + ev_run(ev->libev_loop, EVRUN_ONCE); - ev_init(&timeout_watcher.w, NULL); - ev_set_cb(&timeout_watcher.timer, timeout_watcher_cb); - timeout_watcher.timer.repeat = ((ev_tstamp) timeout_ms)/1000.0; - force_assert(timeout_watcher.timer.repeat); - ev_timer_again(ev->libev_loop, &timeout_watcher.timer); - - ev_loop(ev->libev_loop, EVLOOP_ONESHOT); - - ev_timer_stop(ev->libev_loop, &timeout_watcher.timer); - return 0; } @@ -143,6 +132,8 @@ static int fdevent_libev_reset(fdevents *ev) { } int fdevent_libev_init(fdevents *ev) { + struct ev_timer * const timer = &timeout_watcher; + ev->type = FDEVENT_HANDLER_LIBEV; #define SET(x) \ ev->x = fdevent_libev_##x; @@ -164,6 +155,8 @@ int fdevent_libev_init(fdevents *ev) { return -1; } + + ev_timer_init(timer, timeout_watcher_cb, 0.0, 1.0); return 0; }