Permalink
Browse files

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)
  • Loading branch information...
Bram Moolenaar
Bram Moolenaar committed Mar 10, 2010
1 parent 622d45c commit 3a97e3116dc754adbc20c129d73dca281b299678
Showing with 45 additions and 31 deletions.
  1. +0 −15 src/if_xcmdsrv.c
  2. +26 −1 src/netbeans.c
  3. +0 −15 src/os_unixx.h
  4. +2 −0 src/version.c
  5. +17 −0 src/vim.h
View
@@ -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.
View
@@ -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 */
View
@@ -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
View
@@ -681,6 +681,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 392,
/**/
391,
/**/
View
@@ -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 =============== */
/*

0 comments on commit 3a97e31

Please sign in to comment.