adjust_timeout: with default lws_plat_service_tsi allow beings passed 0 timeout
authorAndy Green <andy@warmcat.com>
Mon, 10 Oct 2016 12:34:34 +0000 (20:34 +0800)
committerAndy Green <andy@warmcat.com>
Mon, 10 Oct 2016 12:34:34 +0000 (20:34 +0800)
Some people are calling service with zero timeout, taking care of
not busywaiting by some other external arrangements.

Adapt the forced service signalling to survive this.

lib/lws-plat-unix.c
lib/lws-plat-win.c

index 2c6cfcd..f228e33 100644 (file)
@@ -130,19 +130,16 @@ 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) {
+       if (!lws_service_adjust_timeout(context, 1, tsi)) {
                /* -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;
+               if (!lws_service_adjust_timeout(context, 1, pt->tid))
+                       /* yes... come back again quickly */
+                       timeout_ms = 0;
        }
 
        n = poll(pt->fds, pt->fds_count, timeout_ms);
index be7d577..180ed46 100644 (file)
@@ -212,8 +212,17 @@ lws_plat_service_tsi(struct lws_context *context, int timeout_ms, int tsi)
                        i--;
        }
 
-       /* if we know something needs service already, don't wait in poll */
-       timeout_ms = lws_service_adjust_timeout(context, timeout_ms, tsi);
+       /*
+        * is there anybody with pending stuff that needs service forcing?
+        */
+       if (!lws_service_adjust_timeout(context, 1, tsi)) {
+               /* -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 quickly */
+                       timeout_ms = 0;
+       }
 
        ev = WSAWaitForMultipleEvents( 1,  pt->events , FALSE, timeout_ms, FALSE);
        if (ev == WSA_WAIT_EVENT_0) {