diff --git a/lib/libuv.c b/lib/libuv.c
index bb1bee30..da1405c1 100644
--- a/lib/libuv.c
+++ b/lib/libuv.c
@@ -52,7 +52,7 @@ lws_uv_idle(uv_idle_t *handle
 		if (!lws_service_adjust_timeout(pt->context, 1, pt->tid))
 			/* yes... come back again later */
 			lwsl_debug("%s: done again\n", __func__);
-			return;
+		return;
 	}
 
 	/* there is nobody who needs service forcing, shut down idle */
diff --git a/lib/lws-plat-unix.c b/lib/lws-plat-unix.c
index adc80469..3466284f 100644
--- a/lib/lws-plat-unix.c
+++ b/lib/lws-plat-unix.c
@@ -144,6 +144,19 @@ lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
 	context->service_tid = context->service_tid_detected;
 
 	timeout_ms = lws_service_adjust_timeout(context, timeout_ms, tsi);
+	/*
+	 * is there anybody with pending stuff that needs service forcing?
+	 */
+	if (!timeout_ms) {
+		/* -1 timeout means just do forced service */
+		lws_plat_service_tsi(context, -1, pt->tid);
+		/* still somebody left who wants forced service? */
+		if (!lws_service_adjust_timeout(context, 1, pt->tid)) {
+			/* yes... come back again later */
+			lwsl_debug("%s: done again\n", __func__);
+		}
+		return 0;
+	}
 
 	n = poll(pt->fds, pt->fds_count, timeout_ms);