Patch 7.4.1355
Problem: Win32 console and GUI handle channels differently.
Solution: Consolidate code between Win32 console and GUI.
Files: src/channel.c, src/eval.c, src/gui_w48.c, src/os_win32.c,
src/proto/channel.pro
*** ../vim-7.4.1354/src/channel.c 2016-02-18 22:23:21.169660447 +0100
--- src/channel.c 2016-02-19 20:59:19.203893645 +0100
***************
*** 1508,1524 ****
static int
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)
ch_logn(channel, "Waiting for up to %d msec", timeout);
-
# ifdef WIN32
! if (channel->CH_SOCK == CHAN_FD_INVALID)
{
DWORD nread;
int diff;
--- 1508,1518 ----
static int
channel_wait(channel_T *channel, sock_T fd, int timeout)
{
if (timeout > 0)
ch_logn(channel, "Waiting for up to %d msec", timeout);
# ifdef WIN32
! if (fd != channel->CH_SOCK)
{
DWORD nread;
int diff;
***************
*** 1537,1580 ****
* TODO: increase the sleep time when looping more often */
Sleep(5);
}
- return FAIL;
}
#endif
-
- FD_ZERO(&rfds);
- FD_SET((int)fd, &rfds);
- tval.tv_sec = timeout / 1000;
- tval.tv_usec = (timeout % 1000) * 1000;
- for (;;)
{
! ret = select((int)fd + 1, &rfds, NULL, NULL, &tval);
! # ifdef EINTR
! if (ret == -1 && errno == EINTR)
! continue;
! # endif
! if (ret <= 0)
! {
! ch_log(channel, "Nothing to read");
! return FAIL;
! }
! break;
! }
#else
! # ifdef HAVE_POLL
! struct pollfd fds;
! if (timeout > 0)
! ch_logn(channel, "Waiting for %d msec", timeout);
! fds.fd = fd;
! fds.events = POLLIN;
! if (poll(&fds, 1, timeout) <= 0)
! {
! ch_log(channel, "Nothing to read");
! return FAIL;
! }
# endif
#endif
! return OK;
}
/*
--- 1531,1578 ----
* TODO: increase the sleep time when looping more often */
Sleep(5);
}
}
+ else
#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_SET((int)fd, &rfds);
! tval.tv_sec = timeout / 1000;
! tval.tv_usec = (timeout % 1000) * 1000;
! for (;;)
! {
! ret = select((int)fd + 1, &rfds, NULL, NULL, &tval);
! # ifdef EINTR
! SOCK_ERRNO;
! if (ret == -1 && errno == EINTR)
! continue;
! # endif
! if (ret > 0)
! return OK;
! break;
! }
! # else
! struct pollfd fds;
! fds.fd = fd;
! fds.events = POLLIN;
! if (poll(&fds, 1, timeout) > 0)
! return OK;
# endif
#endif
! }
! ch_log(channel, "Nothing to read");
! return FAIL;
}
/*
***************
*** 1667,1674 ****
}
#endif
! /* Reading a socket disconnection (readlen == 0), or a socket error. */
! if (readlen <= 0)
{
/* Queue a "DETACH" netbeans message in the command queue in order to
* terminate the netbeans session later. Do not end the session here
--- 1665,1673 ----
}
#endif
! /* Reading a socket disconnection (readlen == 0), or a socket error.
! * TODO: call error callback. */
! if (readlen <= 0 && channel->ch_job == NULL)
{
/* Queue a "DETACH" netbeans message in the command queue in order to
* terminate the netbeans session later. Do not end the session here
***************
*** 1836,1841 ****
--- 1835,1869 ----
}
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
/*
***************
*** 1969,1975 ****
}
# endif /* UNIX && !HAVE_SELECT */
! # if (!defined(FEAT_GUI_W32) && defined(HAVE_SELECT)) || defined(PROTO)
/*
* The type of "rfds" is hidden to avoid problems with the function proto.
*/
--- 1997,2003 ----
}
# endif /* UNIX && !HAVE_SELECT */
! # if (!defined(WIN32) && defined(HAVE_SELECT)) || defined(PROTO)
/*
* The type of "rfds" is hidden to avoid problems with the function proto.
*/
***************
*** 2034,2040 ****
return ret;
}
! # endif /* !FEAT_GUI_W32 && HAVE_SELECT */
/*
* Execute queued up commands.
--- 2062,2068 ----
return ret;
}
! # endif /* !WIN32 && HAVE_SELECT */
/*
* Execute queued up commands.
*** ../vim-7.4.1354/src/eval.c 2016-02-18 22:23:21.173660406 +0100
--- src/eval.c 2016-02-19 20:08:38.667979860 +0100
***************
*** 14635,14648 ****
ga_concat(&ga, (char_u *)" ");
ga_concat(&ga, (char_u *)argv[i]);
}
! ch_logs(NULL, "Starting job: %s", ga.ga_data);
ga_clear(&ga);
}
# endif
mch_start_job(argv, job, &options);
#else
# ifdef FEAT_CHANNEL
! ch_logs(NULL, "Starting job: %s", cmd);
# endif
mch_start_job((char *)cmd, job, &options);
#endif
--- 14635,14648 ----
ga_concat(&ga, (char_u *)" ");
ga_concat(&ga, (char_u *)argv[i]);
}
! ch_logs(NULL, "Starting job: %s", (char *)ga.ga_data);
ga_clear(&ga);
}
# endif
mch_start_job(argv, job, &options);
#else
# ifdef FEAT_CHANNEL
! ch_logs(NULL, "Starting job: %s", (char *)cmd);
# endif
mch_start_job((char *)cmd, job, &options);
#endif
*** ../vim-7.4.1354/src/gui_w48.c 2016-02-17 20:48:14.887567873 +0100
--- src/gui_w48.c 2016-02-19 20:52:42.580082266 +0100
***************
*** 2099,2104 ****
--- 2099,2108 ----
parse_queued_messages();
#endif
+ #ifdef FEAT_CHANNEL
+ channel_handle_events();
+ #endif
+
/*
* Don't use gui_mch_update() because then we will spin-lock until a
* char arrives, instead we use GetMessage() to hang until an
*** ../vim-7.4.1354/src/os_win32.c 2016-02-16 21:02:17.603873545 +0100
--- src/os_win32.c 2016-02-19 20:52:58.331915879 +0100
***************
*** 1128,1157 ****
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,
* MOUSE_MIDDLE, or MOUSE_RIGHT for a click; MOUSE_DRAG for a mouse
--- 1128,1133 ----
***************
*** 1495,1502 ****
#endif
#ifdef FEAT_CHANNEL
! if (handle_channel_event())
! return TRUE;
#endif
if (0
--- 1471,1477 ----
#endif
#ifdef FEAT_CHANNEL
! channel_handle_events();
#endif
if (0
*** ../vim-7.4.1354/src/proto/channel.pro 2016-02-18 22:23:21.173660406
+0100
--- src/proto/channel.pro 2016-02-19 20:53:33.843540778 +0100
***************
*** 30,35 ****
--- 30,36 ----
char_u *channel_read_block(channel_T *channel);
int channel_read_json_block(channel_T *channel, int id, typval_T **rettv);
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_poll_setup(int nfd_in, void *fds_in);
int channel_poll_check(int ret_in, void *fds_in);
*** ../vim-7.4.1354/src/version.c 2016-02-19 19:43:45.779649915 +0100
--- src/version.c 2016-02-19 20:59:54.815517655 +0100
***************
*** 749,750 ****
--- 749,752 ----
{ /* Add new patch number below this line */
+ /**/
+ 1355,
/**/
--
Luxury. We used to have to get out of the lake at three o'clock in the
morning, clean the lake, eat a handful of hot gravel, go to work at the
mill every day for tuppence a month, come home, and Dad would beat us
around the head and neck with a broken bottle, if we were LUCKY!
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.