1
0
forked from aniani/vim

patch 7.4.1355

Problem:    Win32 console and GUI handle channels differently.
Solution:   Consolidate code between Win32 console and GUI.
This commit is contained in:
Bram Moolenaar
2016-02-19 21:05:03 +01:00
parent 223b723be0
commit ed5a78e11c
6 changed files with 80 additions and 70 deletions

View File

@@ -1508,17 +1508,11 @@ channel_free_all(void)
static int static int
channel_wait(channel_T *channel, sock_T fd, int timeout) channel_wait(channel_T *channel, sock_T fd, int timeout)
{ {
#if defined(HAVE_SELECT) && !defined(FEAT_GUI_W32)
struct timeval tval;
fd_set rfds;
int ret;
if (timeout > 0) if (timeout > 0)
ch_logn(channel, "Waiting for up to %d msec", timeout); ch_logn(channel, "Waiting for up to %d msec", timeout);
# ifdef WIN32 # ifdef WIN32
if (channel->CH_SOCK == CHAN_FD_INVALID) if (fd != channel->CH_SOCK)
{ {
DWORD nread; DWORD nread;
int diff; int diff;
@@ -1537,9 +1531,19 @@ channel_wait(channel_T *channel, sock_T fd, int timeout)
* TODO: increase the sleep time when looping more often */ * TODO: increase the sleep time when looping more often */
Sleep(5); Sleep(5);
} }
return FAIL;
} }
else
#endif #endif
{
#if defined(FEAT_GUI_W32)
/* Can't check socket for Win32 GUI, always return OK. */
ch_log(channel, "Can't check, assuming there is something to read");
return OK;
#else
# if defined(HAVE_SELECT)
struct timeval tval;
fd_set rfds;
int ret;
FD_ZERO(&rfds); FD_ZERO(&rfds);
FD_SET((int)fd, &rfds); FD_SET((int)fd, &rfds);
@@ -1549,33 +1553,27 @@ channel_wait(channel_T *channel, sock_T fd, int timeout)
{ {
ret = select((int)fd + 1, &rfds, NULL, NULL, &tval); ret = select((int)fd + 1, &rfds, NULL, NULL, &tval);
# ifdef EINTR # ifdef EINTR
SOCK_ERRNO;
if (ret == -1 && errno == EINTR) if (ret == -1 && errno == EINTR)
continue; continue;
# endif # endif
if (ret <= 0) if (ret > 0)
{ return OK;
ch_log(channel, "Nothing to read");
return FAIL;
}
break; break;
} }
# else # else
# ifdef HAVE_POLL
struct pollfd fds; struct pollfd fds;
if (timeout > 0)
ch_logn(channel, "Waiting for %d msec", timeout);
fds.fd = fd; fds.fd = fd;
fds.events = POLLIN; fds.events = POLLIN;
if (poll(&fds, 1, timeout) <= 0) if (poll(&fds, 1, timeout) > 0)
{ return OK;
# endif
#endif
}
ch_log(channel, "Nothing to read"); ch_log(channel, "Nothing to read");
return FAIL; return FAIL;
} }
# endif
#endif
return OK;
}
/* /*
* Return a unique ID to be used in a message. * Return a unique ID to be used in a message.
@@ -1667,8 +1665,9 @@ channel_read(channel_T *channel, int which, char *func)
} }
#endif #endif
/* Reading a socket disconnection (readlen == 0), or a socket error. */ /* Reading a socket disconnection (readlen == 0), or a socket error.
if (readlen <= 0) * TODO: call error callback. */
if (readlen <= 0 && channel->ch_job == NULL)
{ {
/* Queue a "DETACH" netbeans message in the command queue in order to /* Queue a "DETACH" netbeans message in the command queue in order to
* terminate the netbeans session later. Do not end the session here * terminate the netbeans session later. Do not end the session here
@@ -1836,6 +1835,35 @@ channel_fd2channel(sock_T fd, int *whichp)
} }
return NULL; return NULL;
} }
void
channel_handle_events(void)
{
channel_T *channel;
int which;
static int loop = 0;
/* Skip heavily polling */
if (loop++ % 2)
return;
for (channel = first_channel; channel != NULL; channel = channel->ch_next)
{
# ifdef FEAT_GUI_W32
/* only check the pipes */
for (which = CHAN_OUT; which < CHAN_ERR; ++which)
# else
# ifdef CHANNEL_PIPES
/* check the socket and pipes */
for (which = CHAN_SOCK; which < CHAN_ERR; ++which)
# else
/* only check the socket */
which = CHAN_SOCK;
# endif
# endif
channel_read(channel, which, "channel_handle_events");
}
}
# endif # endif
/* /*
@@ -1969,7 +1997,7 @@ channel_poll_check(int ret_in, void *fds_in)
} }
# endif /* UNIX && !HAVE_SELECT */ # endif /* UNIX && !HAVE_SELECT */
# if (!defined(FEAT_GUI_W32) && defined(HAVE_SELECT)) || defined(PROTO) # if (!defined(WIN32) && defined(HAVE_SELECT)) || defined(PROTO)
/* /*
* The type of "rfds" is hidden to avoid problems with the function proto. * The type of "rfds" is hidden to avoid problems with the function proto.
*/ */
@@ -2034,7 +2062,7 @@ channel_select_check(int ret_in, void *rfds_in)
return ret; return ret;
} }
# endif /* !FEAT_GUI_W32 && HAVE_SELECT */ # endif /* !WIN32 && HAVE_SELECT */
/* /*
* Execute queued up commands. * Execute queued up commands.

View File

@@ -14635,14 +14635,14 @@ f_job_start(typval_T *argvars UNUSED, typval_T *rettv)
ga_concat(&ga, (char_u *)" "); ga_concat(&ga, (char_u *)" ");
ga_concat(&ga, (char_u *)argv[i]); ga_concat(&ga, (char_u *)argv[i]);
} }
ch_logs(NULL, "Starting job: %s", ga.ga_data); ch_logs(NULL, "Starting job: %s", (char *)ga.ga_data);
ga_clear(&ga); ga_clear(&ga);
} }
# endif # endif
mch_start_job(argv, job, &options); mch_start_job(argv, job, &options);
#else #else
# ifdef FEAT_CHANNEL # ifdef FEAT_CHANNEL
ch_logs(NULL, "Starting job: %s", cmd); ch_logs(NULL, "Starting job: %s", (char *)cmd);
# endif # endif
mch_start_job((char *)cmd, job, &options); mch_start_job((char *)cmd, job, &options);
#endif #endif

View File

@@ -2099,6 +2099,10 @@ 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

@@ -1128,30 +1128,6 @@ mch_setmouse(int on)
SetConsoleMode(g_hConIn, cmodein); SetConsoleMode(g_hConIn, cmodein);
} }
#ifdef FEAT_CHANNEL
static int
handle_channel_event(void)
{
int ret;
fd_set rfds;
int maxfd;
FD_ZERO(&rfds);
maxfd = channel_select_setup(-1, &rfds);
if (maxfd >= 0)
{
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 0;
ret = select(maxfd + 1, &rfds, NULL, NULL, &tv);
if (ret > 0 && channel_select_check(ret, &rfds) > 0)
return TRUE;
}
return FALSE;
}
#endif
/* /*
* Decode a MOUSE_EVENT. If it's a valid event, return MOUSE_LEFT, * Decode a MOUSE_EVENT. If it's a valid event, return MOUSE_LEFT,
* MOUSE_MIDDLE, or MOUSE_RIGHT for a click; MOUSE_DRAG for a mouse * MOUSE_MIDDLE, or MOUSE_RIGHT for a click; MOUSE_DRAG for a mouse
@@ -1495,8 +1471,7 @@ WaitForChar(long msec)
#endif #endif
#ifdef FEAT_CHANNEL #ifdef FEAT_CHANNEL
if (handle_channel_event()) channel_handle_events();
return TRUE;
#endif #endif
if (0 if (0

View File

@@ -30,6 +30,7 @@ void channel_read(channel_T *channel, int which, char *func);
char_u *channel_read_block(channel_T *channel); char_u *channel_read_block(channel_T *channel);
int channel_read_json_block(channel_T *channel, int id, typval_T **rettv); int channel_read_json_block(channel_T *channel, int id, typval_T **rettv);
channel_T *channel_fd2channel(sock_T fd, int *whichp); channel_T *channel_fd2channel(sock_T fd, int *whichp);
void channel_handle_events(void);
int channel_send(channel_T *channel, char_u *buf, char *fun); int channel_send(channel_T *channel, char_u *buf, char *fun);
int channel_poll_setup(int nfd_in, void *fds_in); int channel_poll_setup(int nfd_in, void *fds_in);
int channel_poll_check(int ret_in, void *fds_in); int channel_poll_check(int ret_in, void *fds_in);

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 */
/**/
1355,
/**/ /**/
1354, 1354,
/**/ /**/