Mercurial > vim
changeset 2109:6c3c2e464a96 v7.2.392
updated for version 7.2.392
Problem: Netbeans hangs reading from a socket at the maximum block size.
Solution: Use select() or poll(). (Xavier de Gaye)
author | Bram Moolenaar <bram@zimbu.org> |
---|---|
date | Wed, 10 Mar 2010 16:12:48 +0100 |
parents | 3cdf2a653e00 |
children | 0f552ca271c2 |
files | src/if_xcmdsrv.c src/netbeans.c src/os_unixx.h src/version.c src/vim.h |
diffstat | 5 files changed, 45 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/src/if_xcmdsrv.c +++ b/src/if_xcmdsrv.c @@ -21,21 +21,6 @@ # include <X11/Xatom.h> # endif -# if defined(HAVE_SYS_SELECT_H) && \ - (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) -# include <sys/select.h> -# endif - -# ifndef HAVE_SELECT -# ifdef HAVE_SYS_POLL_H -# include <sys/poll.h> -# else -# ifdef HAVE_POLL_H -# include <poll.h> -# endif -# endif -# endif - /* * This file provides procedures that implement the command server * functionality of Vim when in contact with an X11 server.
--- a/src/netbeans.c +++ b/src/netbeans.c @@ -736,6 +736,14 @@ messageFromNetbeans(gpointer clientData #ifndef FEAT_GUI_GTK static int level = 0; #endif +#ifdef HAVE_SELECT + struct timeval tval; + fd_set rfds; +#else +# ifdef HAVE_POLL + struct pollfd fds; +# endif +#endif if (sd < 0) { @@ -755,9 +763,26 @@ messageFromNetbeans(gpointer clientData return; /* out of memory! */ } - /* Keep on reading for as long as there is something to read. */ + /* Keep on reading for as long as there is something to read. + * Use select() or poll() to avoid blocking on a message that is exactly + * MAXMSGSIZE long. */ for (;;) { +#ifdef HAVE_SELECT + FD_ZERO(&rfds); + FD_SET(sd, &rfds); + tval.tv_sec = 0; + tval.tv_usec = 0; + if (select(sd + 1, &rfds, NULL, NULL, &tval) <= 0) + break; +#else +# ifdef HAVE_POLL + fds.fd = sd; + fds.events = POLLIN; + if (poll(&fds, 1, 0) <= 0) + break; +# endif +#endif len = sock_read(sd, buf, MAXMSGSIZE); if (len <= 0) break; /* error or nothing more to read */
--- a/src/os_unixx.h +++ b/src/os_unixx.h @@ -28,11 +28,6 @@ # include <sys/wait.h> # endif -# if defined(HAVE_SYS_SELECT_H) && \ - (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) -# include <sys/select.h> -# endif - # ifndef WEXITSTATUS # ifdef HAVE_UNION_WAIT # define WEXITSTATUS(stat_val) ((stat_val).w_T.w_Retcode) @@ -65,16 +60,6 @@ # include <string.h> #endif -#ifndef HAVE_SELECT -# ifdef HAVE_SYS_POLL_H -# include <sys/poll.h> -# else -# ifdef HAVE_POLL_H -# include <poll.h> -# endif -# endif -#endif - #ifdef HAVE_SYS_STREAM_H # include <sys/stream.h> #endif
--- a/src/version.c +++ b/src/version.c @@ -682,6 +682,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 392, +/**/ 391, /**/ 390,
--- a/src/vim.h +++ b/src/vim.h @@ -477,6 +477,23 @@ typedef unsigned long u8char_T; /* l # include <stdarg.h> #endif +# if defined(HAVE_SYS_SELECT_H) && \ + (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) +# include <sys/select.h> +# endif + +# ifndef HAVE_SELECT +# ifdef HAVE_SYS_POLL_H +# include <sys/poll.h> +# define HAVE_POLL +# else +# ifdef HAVE_POLL_H +# include <poll.h> +# define HAVE_POLL +# endif +# endif +# endif + /* ================ end of the header file puzzle =============== */ /*