Mercurial > vim
changeset 8757:4fb37555e814 v7.4.1667
commit https://github.com/vim/vim/commit/84e1d2b21a424f2687b61daaf84f5fc4f1ab0abe
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Mar 28 14:20:41 2016 +0200
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.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 28 Mar 2016 14:30:05 +0200 |
parents | 72dbac4224b8 |
children | b9b73c04e542 |
files | src/channel.c src/version.c |
diffstat | 2 files changed, 14 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -2371,8 +2371,9 @@ channel_wait(channel_T *channel, sock_T 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 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