From 84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 28 Mar 2016 14:20:41 +0200 Subject: [PATCH] patch 7.4.1667 Problem: Win32: waiting on a pipe with fixed sleep time. Solution: Start with a short delay and increase it when looping. --- src/channel.c | 18 ++++++++++++------ src/version.c | 2 ++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/channel.c b/src/channel.c index a506598d7..70c441353 100644 --- a/src/channel.c +++ b/src/channel.c @@ -2371,8 +2371,9 @@ channel_wait(channel_T *channel, sock_T fd, int timeout) if (fd != channel->CH_SOCK_FD) { DWORD nread; - int diff; + int sleep_time; DWORD deadline = GetTickCount() + timeout; + int delay = 1; /* reading from a pipe, not a socket */ while (TRUE) @@ -2380,12 +2381,17 @@ channel_wait(channel_T *channel, sock_T fd, int timeout) if (PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &nread, NULL) && nread > 0) return OK; - diff = deadline - GetTickCount(); - if (diff <= 0) + sleep_time = deadline - GetTickCount(); + if (sleep_time <= 0) break; - /* Wait for 5 msec. - * TODO: increase the sleep time when looping more often */ - Sleep(5); + /* Wait for a little while. Very short at first, up to 10 msec + * after looping a few times. */ + if (sleep_time > delay) + sleep_time = delay; + Sleep(sleep_time); + delay = delay * 2; + if (delay > 10) + delay = 10; } } else diff --git a/src/version.c b/src/version.c index 5a55707fa..ae5d4b021 100644 --- a/src/version.c +++ b/src/version.c @@ -748,6 +748,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1667, /**/ 1666, /**/ -- 2.50.1