updated for version 7.3.295

Problem:    When filtering text with an external command Vim may not read all
            the output.
Solution:   When select() is interrupted loop and try again. (James Vega)
This commit is contained in:
Bram Moolenaar
2011-09-07 14:06:47 +02:00
parent 01a78342e0
commit 493c7a8541
2 changed files with 15 additions and 3 deletions

View File

@@ -4819,7 +4819,8 @@ WaitForChar(msec)
/* /*
* Wait "msec" msec until a character is available from file descriptor "fd". * Wait "msec" msec until a character is available from file descriptor "fd".
* Time == -1 will block forever. * "msec" == 0 will check for characters once.
* "msec" == -1 will block until a character is available.
* When a GUI is being used, this will not be used for input -- webb * When a GUI is being used, this will not be used for input -- webb
* Returns also, when a request from Sniff is waiting -- toni. * Returns also, when a request from Sniff is waiting -- toni.
* Or when a Linux GPM mouse event is waiting. * Or when a Linux GPM mouse event is waiting.
@@ -5057,7 +5058,8 @@ RealWaitForChar(fd, msec, check_for_gpm)
/* /*
* Select on ready for reading and exceptional condition (end of file). * Select on ready for reading and exceptional condition (end of file).
*/ */
FD_ZERO(&rfds); /* calls bzero() on a sun */ select_eintr:
FD_ZERO(&rfds);
FD_ZERO(&efds); FD_ZERO(&efds);
FD_SET(fd, &rfds); FD_SET(fd, &rfds);
# if !defined(__QNX__) && !defined(__CYGWIN32__) # if !defined(__QNX__) && !defined(__CYGWIN32__)
@@ -5117,6 +5119,14 @@ RealWaitForChar(fd, msec, check_for_gpm)
# else # else
ret = select(maxfd + 1, &rfds, NULL, &efds, tvp); ret = select(maxfd + 1, &rfds, NULL, &efds, tvp);
# endif # endif
# ifdef EINTR
if (ret == -1 && errno == EINTR)
/* Interrupted by a signal, need to try again. We ignore msec
* here, because we do want to check even after a timeout if
* characters are available. Needed for reading output of an
* external command after the process has finished. */
goto select_eintr;
# endif
# ifdef __TANDEM # ifdef __TANDEM
if (ret == -1 && errno == ENOTSUP) if (ret == -1 && errno == ENOTSUP)
{ {
@@ -5124,7 +5134,7 @@ RealWaitForChar(fd, msec, check_for_gpm)
FD_ZERO(&efds); FD_ZERO(&efds);
ret = 0; ret = 0;
} }
#endif # endif
# ifdef FEAT_MZSCHEME # ifdef FEAT_MZSCHEME
if (ret == 0 && mzquantum_used) if (ret == 0 && mzquantum_used)
/* loop if MzThreads must be scheduled and timeout occurred */ /* loop if MzThreads must be scheduled and timeout occurred */

View File

@@ -709,6 +709,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
295,
/**/ /**/
294, 294,
/**/ /**/