# HG changeset patch # User Bram Moolenaar # Date 1268233968 -3600 # Node ID 6c3c2e464a9628bcbfe21317b8fd90ae27076735 # Parent 3cdf2a653e005387c4deeceb7281d62fffd34687 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 --- 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 --- 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 */ diff --git a/src/os_unixx.h b/src/os_unixx.h --- 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 --- 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, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -477,6 +477,23 @@ typedef unsigned long u8char_T; /* l # 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 =============== */ /*