# HG changeset patch # User Christian Brabandt # Date 1457557205 -3600 # Node ID ade1797aa6f4329edcbc25f8c1fb61bf116b3722 # Parent d45ad00fd8d243130f0bf612d437f74ac8b0046f commit https://github.com/vim/vim/commit/562ca7142845273bca656aa5aeeda90f001062e0 Author: Bram Moolenaar 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. diff --git a/src/channel.c b/src/channel.c --- 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; } diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -744,6 +744,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1527, +/**/ 1526, /**/ 1525,