]> granicus.if.org Git - vim/commitdiff
patch 7.4.1527 v7.4.1527
authorBram Moolenaar <Bram@vim.org>
Wed, 9 Mar 2016 20:50:05 +0000 (21:50 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 9 Mar 2016 20:50:05 +0000 (21:50 +0100)
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.

src/channel.c
src/version.c

index 4eedb03eb32024d2e088d2612f51aa2a3e13484f..094b58f2c4d0d3d4b7af4e5e90319256b49acc76 100644 (file)
@@ -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;
            }
index e98a2ae6fe6ce8f6dc7af4c8633c5bf0ed6cc595..af4ebc07f00fd24ddecccc1b0f47f71333ab153f 100644 (file)
@@ -743,6 +743,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1527,
 /**/
     1526,
 /**/