changeset 10418:56cb9538386c v8.0.0103

commit https://github.com/vim/vim/commit/8a8199e4a1814b10630a770165502abb1121cd1b Author: Bram Moolenaar <Bram@vim.org> Date: Sat Nov 26 15:13:33 2016 +0100 patch 8.0.0103 Problem: May not process channel readahead. (skywind) Solution: If there is readahead don't block on input.
author Christian Brabandt <cb@256bit.org>
date Sat, 26 Nov 2016 15:15:03 +0100
parents 2e7347e59ae8
children 922418f4ca6c
files src/channel.c src/misc2.c src/os_unix.c src/os_win32.c src/proto/channel.pro src/version.c
diffstat 6 files changed, 40 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/channel.c
+++ b/src/channel.c
@@ -3900,6 +3900,31 @@ channel_parse_messages(void)
 }
 
 /*
+ * Return TRUE if any channel has readahead.  That means we should not block on
+ * waiting for input.
+ */
+    int
+channel_any_readahead(void)
+{
+    channel_T	*channel = first_channel;
+    ch_part_T	part = PART_SOCK;
+
+    while (channel != NULL)
+    {
+	if (channel_has_readahead(channel, part))
+	    return TRUE;
+	if (part < PART_ERR)
+	    ++part;
+	else
+	{
+	    channel = channel->ch_next;
+	    part = PART_SOCK;
+	}
+    }
+    return FALSE;
+}
+
+/*
  * Mark references to lists used in channels.
  */
     int
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -6264,7 +6264,7 @@ parse_queued_messages(void)
 }
 #endif
 
-#ifdef ELAPSED_TIMEVAL  /* proto is defined in vim.h */
+#ifdef ELAPSED_TIMEVAL  /* no PROTO here, proto is defined in vim.h */
 /*
  * Return time in msec since "start_tv".
  */
@@ -6288,9 +6288,6 @@ elapsed(DWORD start_tick)
 {
     DWORD	now = GetTickCount();
 
-    if (now < start_tick)
-	/* overflow */
-	return (long)now;
     return (long)now - (long)start_tick;
 }
 #endif
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -462,6 +462,10 @@ mch_inchar(
 	/* Checking if a job ended requires polling.  Do this every 100 msec. */
 	if (has_pending_job() && (wait_time < 0 || wait_time > 100L))
 	    wait_time = 100L;
+	/* If there is readahead then parse_queued_messages() timed out and we
+	 * should call it again soon. */
+	if ((wait_time < 0 || wait_time > 100L) && channel_any_readahead())
+	    wait_time = 10L;
 #endif
 
 	/*
--- a/src/os_win32.c
+++ b/src/os_win32.c
@@ -1351,9 +1351,15 @@ WaitForChar(long msec)
 	    DWORD dwWaitTime = dwEndTime - dwNow;
 
 #ifdef FEAT_JOB_CHANNEL
-	    /* Check channel while waiting input. */
+	    /* Check channel while waiting for input. */
 	    if (dwWaitTime > 100)
+	    {
 		dwWaitTime = 100;
+		/* If there is readahead then parse_queued_messages() timed out
+		 * and we should call it again soon. */
+		if (channel_any_readahead())
+		    dwWaitTime = 10;
+	    }
 #endif
 #ifdef FEAT_MZSCHEME
 	    if (mzthreads_allowed() && p_mzq > 0
--- a/src/proto/channel.pro
+++ b/src/proto/channel.pro
@@ -44,6 +44,7 @@ int channel_poll_check(int ret_in, void 
 int channel_select_setup(int maxfd_in, void *rfds_in, void *wfds_in);
 int channel_select_check(int ret_in, void *rfds_in, void *wfds_in);
 int channel_parse_messages(void);
+int channel_any_readahead(void);
 int set_ref_in_channel(int copyID);
 ch_part_T channel_part_send(channel_T *channel);
 ch_part_T channel_part_read(channel_T *channel);
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    103,
+/**/
     102,
 /**/
     101,