Signed-off-by: Alistair Francis <alistair.fran...@xilinx.com> Acked-by: Edgar E. Iglesias <edgar.igles...@xilinx.com> ---
util/oslib-win32.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/util/oslib-win32.c b/util/oslib-win32.c index a015e1ac96..3630e46499 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -432,10 +432,10 @@ static int poll_rest(gboolean poll_msgs, HANDLE *handles, gint nhandles, } } - /* If no timeout and polling several handles, recurse to poll - * the rest of them. + /* We only found one and we are waiting on more then one. Let's try + * again. */ - if (timeout == 0 && nhandles > 1) { + if (nhandles > 1) { /* Remove the handle that fired */ int i; if ((ready - WAIT_OBJECT_0) < nhandles - 1) { @@ -444,7 +444,20 @@ static int poll_rest(gboolean poll_msgs, HANDLE *handles, gint nhandles, } } nhandles--; - recursed_result = poll_rest(FALSE, handles, nhandles, fds, nfds, 0); + + /* If we just had a very small timeout let's increase it when we + * recurse to ensure we don't just busy wait. This ensures we let + * the Windows threads block at least a little. If we previously + * had some wait let's set it to zero to avoid blocking for too + * long. + */ + if (timeout < 10) { + timeout = timeout + 1; + } else { + timeout = 0; + } + recursed_result = poll_rest(FALSE, handles, nhandles, fds, + nfds, timeout); return (recursed_result == -1) ? -1 : 1 + recursed_result; } return 1; -- 2.11.0