0
0
mirror of https://github.com/vim/vim.git synced 2025-10-09 06:14:17 -04:00

patch 8.0.0103

Problem:    May not process channel readahead. (skywind)
Solution:   If there is readahead don't block on input.
This commit is contained in:
Bram Moolenaar
2016-11-26 15:13:33 +01:00
parent 7554da4033
commit 8a8199e4a1
6 changed files with 40 additions and 5 deletions

View File

@@ -3899,6 +3899,31 @@ channel_parse_messages(void)
return ret; return ret;
} }
/*
* 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. * Mark references to lists used in channels.
*/ */

View File

@@ -6264,7 +6264,7 @@ parse_queued_messages(void)
} }
#endif #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". * Return time in msec since "start_tv".
*/ */
@@ -6288,9 +6288,6 @@ elapsed(DWORD start_tick)
{ {
DWORD now = GetTickCount(); DWORD now = GetTickCount();
if (now < start_tick)
/* overflow */
return (long)now;
return (long)now - (long)start_tick; return (long)now - (long)start_tick;
} }
#endif #endif

View File

@@ -462,6 +462,10 @@ mch_inchar(
/* Checking if a job ended requires polling. Do this every 100 msec. */ /* Checking if a job ended requires polling. Do this every 100 msec. */
if (has_pending_job() && (wait_time < 0 || wait_time > 100L)) if (has_pending_job() && (wait_time < 0 || wait_time > 100L))
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 #endif
/* /*

View File

@@ -1351,9 +1351,15 @@ WaitForChar(long msec)
DWORD dwWaitTime = dwEndTime - dwNow; DWORD dwWaitTime = dwEndTime - dwNow;
#ifdef FEAT_JOB_CHANNEL #ifdef FEAT_JOB_CHANNEL
/* Check channel while waiting input. */ /* Check channel while waiting for input. */
if (dwWaitTime > 100) if (dwWaitTime > 100)
{
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 #endif
#ifdef FEAT_MZSCHEME #ifdef FEAT_MZSCHEME
if (mzthreads_allowed() && p_mzq > 0 if (mzthreads_allowed() && p_mzq > 0

View File

@@ -44,6 +44,7 @@ int channel_poll_check(int ret_in, void *fds_in);
int channel_select_setup(int maxfd_in, void *rfds_in, void *wfds_in); 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_select_check(int ret_in, void *rfds_in, void *wfds_in);
int channel_parse_messages(void); int channel_parse_messages(void);
int channel_any_readahead(void);
int set_ref_in_channel(int copyID); int set_ref_in_channel(int copyID);
ch_part_T channel_part_send(channel_T *channel); ch_part_T channel_part_send(channel_T *channel);
ch_part_T channel_part_read(channel_T *channel); ch_part_T channel_part_read(channel_T *channel);

View File

@@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
103,
/**/ /**/
102, 102,
/**/ /**/