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 =============== */
 
 /*