0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

patch 7.4.1379

Problem:    Channel test fails on Win32 console.
Solution:   Don't sleep when timeout is zero. Call channel_wait() before
            channel_read(). Channels are not polled during ":sleep". (Yukihiro
            Nakadaira)
This commit is contained in:
Bram Moolenaar 2016-02-21 17:20:55 +01:00
parent 65edff8f51
commit b7522a2f0c
5 changed files with 20 additions and 15 deletions

View File

@ -1582,7 +1582,7 @@ channel_wait(channel_T *channel, sock_T fd, int timeout)
&& nread > 0) && nread > 0)
return OK; return OK;
diff = deadline - GetTickCount(); diff = deadline - GetTickCount();
if (diff < 0) if (diff <= 0)
break; break;
/* Wait for 5 msec. /* Wait for 5 msec.
* TODO: increase the sleep time when looping more often */ * TODO: increase the sleep time when looping more often */
@ -1881,17 +1881,19 @@ channel_fd2channel(sock_T fd, int *partp)
} }
return NULL; return NULL;
} }
# endif
# if defined(WIN32) || defined(PROTO)
/*
* Check the channels for anything that is ready to be read.
* The data is put in the read queue.
*/
void void
channel_handle_events(void) channel_handle_events(void)
{ {
channel_T *channel; channel_T *channel;
int part; int part;
static int loop = 0; sock_T fd;
/* Skip heavily polling */
if (loop++ % 2)
return;
for (channel = first_channel; channel != NULL; channel = channel->ch_next) for (channel = first_channel; channel != NULL; channel = channel->ch_next)
{ {
@ -1907,7 +1909,11 @@ channel_handle_events(void)
part = PART_SOCK; part = PART_SOCK;
# endif # endif
# endif # endif
channel_read(channel, part, "channel_handle_events"); {
fd = channel->ch_part[part].ch_fd;
if (fd != INVALID_FD && channel_wait(channel, fd, 0) == OK)
channel_read(channel, part, "channel_handle_events");
}
} }
} }
# endif # endif

View File

@ -2248,10 +2248,6 @@ gui_mch_wait_for_chars(int wtime)
parse_queued_messages(); parse_queued_messages();
#endif #endif
#ifdef FEAT_CHANNEL
channel_handle_events();
#endif
/* /*
* Don't use gui_mch_update() because then we will spin-lock until a * Don't use gui_mch_update() because then we will spin-lock until a
* char arrives, instead we use GetMessage() to hang until an * char arrives, instead we use GetMessage() to hang until an

View File

@ -6239,6 +6239,11 @@ has_non_ascii(char_u *s)
void void
parse_queued_messages(void) parse_queued_messages(void)
{ {
/* For Win32 mch_breakcheck() does not check for input, do it here. */
# if defined(WIN32) && defined(FEAT_CHANNEL)
channel_handle_events();
# endif
# ifdef FEAT_NETBEANS_INTG # ifdef FEAT_NETBEANS_INTG
/* Process the queued netbeans messages. */ /* Process the queued netbeans messages. */
netbeans_parse_messages(); netbeans_parse_messages();

View File

@ -1470,10 +1470,6 @@ WaitForChar(long msec)
serverProcessPendingMessages(); serverProcessPendingMessages();
#endif #endif
#ifdef FEAT_CHANNEL
channel_handle_events();
#endif
if (0 if (0
#ifdef FEAT_MOUSE #ifdef FEAT_MOUSE
|| g_nMouseClick != -1 || g_nMouseClick != -1

View File

@ -747,6 +747,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 */
/**/
1379,
/**/ /**/
1378, 1378,
/**/ /**/