diff --git a/lib/event-libs/libev/libev.c b/lib/event-libs/libev/libev.c index e3ceccf19..39eb1545b 100644 --- a/lib/event-libs/libev/libev.c +++ b/lib/event-libs/libev/libev.c @@ -46,6 +46,7 @@ lws_ev_idle_cb(struct ev_loop *loop, struct ev_idle *handle, int revents) struct lws_context_per_thread *pt = lws_container_of(handle, struct lws_context_per_thread, ev.idle); lws_usec_t us; + int reschedule = 0; lws_service_do_ripe_rxflow(pt); @@ -54,7 +55,7 @@ lws_ev_idle_cb(struct ev_loop *loop, struct ev_idle *handle, int revents) */ if (!lws_service_adjust_timeout(pt->context, 1, pt->tid)) /* -1 timeout means just do forced service */ - _lws_plat_service_forced_tsi(pt->context, pt->tid); + reschedule = _lws_plat_service_forced_tsi(pt->context, pt->tid); /* account for hrtimer */ @@ -67,7 +68,8 @@ lws_ev_idle_cb(struct ev_loop *loop, struct ev_idle *handle, int revents) lws_pt_unlock(pt); /* there is nobody who needs service forcing, shut down idle */ - ev_idle_stop(loop, handle); + if (!reschedule) + ev_idle_stop(loop, handle); } static void diff --git a/lib/plat/unix/unix-service.c b/lib/plat/unix/unix-service.c index c1b993401..1bfc971ea 100644 --- a/lib/plat/unix/unix-service.c +++ b/lib/plat/unix/unix-service.c @@ -37,9 +37,9 @@ int _lws_plat_service_forced_tsi(struct lws_context *context, int tsi) { struct lws_context_per_thread *pt = &context->pt[tsi]; - int m, n; + int m, n, r; - lws_service_flag_pending(context, tsi); + r = lws_service_flag_pending(context, tsi); /* any socket with events to service? */ for (n = 0; n < (int)pt->fds_count; n++) { @@ -59,7 +59,7 @@ _lws_plat_service_forced_tsi(struct lws_context *context, int tsi) lws_service_do_ripe_rxflow(pt); - return 0; + return r; } #define LWS_POLL_WAIT_LIMIT 2000000000 @@ -204,7 +204,7 @@ _lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi) return 0; } - if (_lws_plat_service_forced_tsi(context, tsi)) + if (_lws_plat_service_forced_tsi(context, tsi) < 0) return -1; return 0;