diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-03-10 16:12:48 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-03-10 16:12:48 +0100 |
commit | 581f6dc94d8177ff1d826d4414ed15288d9fd800 (patch) | |
tree | cb539154da6e4c2f8f4e01f0bd31e9a9ba6c2f71 | |
parent | 37d619f896bb425a0e82199977ab9069434c9b1d (diff) | |
download | vim-581f6dc94d8177ff1d826d4414ed15288d9fd800.zip |
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)
-rw-r--r-- | src/if_xcmdsrv.c | 15 | ||||
-rw-r--r-- | src/netbeans.c | 27 | ||||
-rw-r--r-- | src/os_unixx.h | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim.h | 17 |
5 files changed, 45 insertions, 31 deletions
diff --git a/src/if_xcmdsrv.c b/src/if_xcmdsrv.c index 4b291399d..5412b35d4 100644 --- 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. diff --git a/src/netbeans.c b/src/netbeans.c index 87e0edd14..ed0cd05b6 100644 --- a/src/netbeans.c +++ b/src/netbeans.c @@ -736,6 +736,14 @@ messageFromNetbeans(gpointer clientData UNUSED, #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 UNUSED, 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 */ diff --git a/src/os_unixx.h b/src/os_unixx.h index 3dd254e9a..e46edcf59 100644 --- 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 diff --git a/src/version.c b/src/version.c index a635aad7a..fbe806bf6 100644 --- 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, @@ -477,6 +477,23 @@ typedef unsigned long u8char_T; /* long should be 32 bits or more */ # 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 =============== */ /* |