summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-03-09 21:50:05 +0100
committerBram Moolenaar <Bram@vim.org>2016-03-09 21:50:05 +0100
commit562ca7142845273bca656aa5aeeda90f001062e0 (patch)
tree8eba13730ca8f55c6e217984169ccb6502c0f0e9
parentd5d3d307ddb824f59a2f2516c4b6a6d48762aa58 (diff)
patch 7.4.1527v7.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.
-rw-r--r--src/channel.c47
-rw-r--r--src/version.c2
2 files changed, 31 insertions, 18 deletions
diff --git a/src/channel.c b/src/channel.c
index 4eedb03eb3..094b58f2c4 100644
--- 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
index e98a2ae6fe..af4ebc07f0 100644
--- 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,