Mercurial > vim
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 */