Mercurial > vim
changeset 8473:ade1797aa6f4 v7.4.1527
commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Mar 9 21:50:05 2016 +0100
patch 7.4.1527
Problem: Channel test is flaky on MS-Windows.
Solution: Limit the select() timeout to 50 msec and try with a new socket if
it fails.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 09 Mar 2016 22:00:05 +0100 |
parents | d45ad00fd8d2 |
children | d69a804ff41a |
files | src/channel.c src/version.c |
diffstat | 2 files changed, 31 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/channel.c +++ b/src/channel.c @@ -628,9 +628,8 @@ channel_open( */ while (TRUE) { -#ifndef WIN32 - long elapsed_msec = 0; -#endif + long elapsed_msec = 0; + int waitnow; if (sd >= 0) sock_close(sd); @@ -688,7 +687,7 @@ channel_open( } /* If connect() didn't finish then try using select() to wait for the - * connection to be made. */ + * connection to be made. For Win32 always use select() to wait. */ #ifndef WIN32 if (errno != ECONNREFUSED) #endif @@ -702,19 +701,22 @@ channel_open( struct timeval start_tv; struct timeval end_tv; #endif + /* Limit the waittime to 50 msec. If it doesn't work within this + * time we close the socket and try creating it again. */ + waitnow = waittime > 50 ? 50 : waittime; FD_ZERO(&rfds); FD_SET(sd, &rfds); FD_ZERO(&wfds); FD_SET(sd, &wfds); - tv.tv_sec = waittime / 1000; - tv.tv_usec = (waittime % 1000) * 1000; + tv.tv_sec = waitnow / 1000; + tv.tv_usec = (waitnow % 1000) * 1000; #ifndef WIN32 gettimeofday(&start_tv, NULL); #endif ch_logn(channel, - "Waiting for connection (waittime %d msec)...", waittime); + "Waiting for connection (waiting %d msec)...", waitnow); ret = select((int)sd + 1, &rfds, &wfds, NULL, &tv); if (ret < 0) @@ -729,10 +731,16 @@ channel_open( } #ifdef WIN32 - /* On Win32: select() is expected to work and wait for up to the - * waittime for the socket to be open. */ + /* On Win32: select() is expected to work and wait for up to + * "waitnow" msec for the socket to be open. */ if (FD_ISSET(sd, &wfds)) break; + elapsed_msec = waitnow; + if (waittime > 1 && elapsed_msec < waittime) + { + waittime -= elapsed_msec; + continue; + } #else /* On Linux-like systems: See socket(7) for the behavior * After putting the socket in non-blocking mode, connect() will @@ -778,17 +786,20 @@ channel_open( { /* The port isn't ready but we also didn't get an error. * This happens when the server didn't open the socket - * yet. Wait a bit and try again. */ - mch_delay(waittime < 50 ? (long)waittime : 50L, TRUE); - ui_breakcheck(); + * yet. Select() may return early, wait until the remaining + * "waitnow" and try again. */ + waitnow -= elapsed_msec; + waittime -= elapsed_msec; + if (waitnow > 0) + { + mch_delay((long)waitnow, TRUE); + ui_breakcheck(); + waittime -= waitnow; + } if (!got_int) { - /* reduce the waittime by the elapsed time and the 50 - * msec delay (or a bit more) */ - waittime -= elapsed_msec; - if (waittime > 50) - waittime -= 50; - else + if (waittime <= 0) + /* give it one more try */ waittime = 1; continue; }