diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-03-28 14:20:41 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-03-28 14:20:41 +0200 |
commit | 84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe (patch) | |
tree | 8f5095785414306b52aa2f151b215be141e97a38 /src/channel.c | |
parent | 46c00a6565b8f1f4b7b1041d03eaceaf6ffc4aee (diff) | |
download | vim-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.c | 18 |
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 |