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;
 	    }
--- 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,