From: Bram Moolenaar Date: Wed, 10 Mar 2010 15:12:48 +0000 (+0100) Subject: updated for version 7.2.392 X-Git-Tag: v7.2.392 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=581f6dc94d8177ff1d826d4414ed15288d9fd800;p=vim 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) --- 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 # endif -# if defined(HAVE_SYS_SELECT_H) && \ - (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) -# include -# endif - -# ifndef HAVE_SELECT -# ifdef HAVE_SYS_POLL_H -# include -# else -# ifdef HAVE_POLL_H -# include -# 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 @@ -735,6 +735,14 @@ messageFromNetbeans(gpointer clientData UNUSED, int readlen = 0; #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 # endif -# if defined(HAVE_SYS_SELECT_H) && \ - (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) -# include -# endif - # ifndef WEXITSTATUS # ifdef HAVE_UNION_WAIT # define WEXITSTATUS(stat_val) ((stat_val).w_T.w_Retcode) @@ -65,16 +60,6 @@ # include #endif -#ifndef HAVE_SELECT -# ifdef HAVE_SYS_POLL_H -# include -# else -# ifdef HAVE_POLL_H -# include -# endif -# endif -#endif - #ifdef HAVE_SYS_STREAM_H # include #endif diff --git a/src/version.c b/src/version.c index a635aad7a..fbe806bf6 100644 --- a/src/version.c +++ b/src/version.c @@ -681,6 +681,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 392, /**/ 391, /**/ diff --git a/src/vim.h b/src/vim.h index d22227cf9..b6b4e1e9b 100644 --- a/src/vim.h +++ b/src/vim.h @@ -477,6 +477,23 @@ typedef unsigned long u8char_T; /* long should be 32 bits or more */ # include #endif +# if defined(HAVE_SYS_SELECT_H) && \ + (!defined(HAVE_SYS_TIME_H) || defined(SYS_SELECT_WITH_SYS_TIME)) +# include +# endif + +# ifndef HAVE_SELECT +# ifdef HAVE_SYS_POLL_H +# include +# define HAVE_POLL +# else +# ifdef HAVE_POLL_H +# include +# define HAVE_POLL +# endif +# endif +# endif + /* ================ end of the header file puzzle =============== */ /*