summaryrefslogtreecommitdiff
path: root/src/channel.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-03-28 14:20:41 +0200
committerBram Moolenaar <Bram@vim.org>2016-03-28 14:20:41 +0200
commit84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe (patch)
tree8f5095785414306b52aa2f151b215be141e97a38 /src/channel.c
parent46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee (diff)
downloadvim-84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe.zip
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.
Diffstat (limited to 'src/channel.c')
-rw-r--r--src/channel.c18
1 files changed, 12 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