summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2010-03-10 16:12:48 +0100
committerBram Moolenaar <Bram@vim.org>2010-03-10 16:12:48 +0100
commit581f6dc94d8177ff1d826d4414ed15288d9fd800 (patch)
treecb539154da6e4c2f8f4e01f0bd31e9a9ba6c2f71
parent37d619f896bb425a0e82199977ab9069434c9b1d (diff)
downloadvim-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.c15
-rw-r--r--src/netbeans.c27
-rw-r--r--src/os_unixx.h15
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h17
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,
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 <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 =============== */
/*