diff src/netbeans.c @ 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 351bf13db807
children e8ef654038c4
line wrap: on
line diff
--- 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 */