1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-01 09:51:22 -08:00

(wait_reading_process_output) [HAVE_PTYS]:

When EIO happens, clear channel from descriptor masks before raising
SIGCHLD signal to avoid busy loop between read and sigchld_handler.
(sigchld_handler): Remove sleep (2007-03-11 & 2007-03-26 changes).
This commit is contained in:
Kim F. Storm 2007-03-29 21:24:38 +00:00
parent 1acc2cac84
commit 4740825c2f

View file

@ -4817,8 +4817,8 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
subprocess termination and SIGCHLD. */
else if (nread == 0 && !NETCONN_P (proc))
;
#endif /* O_NDELAY */
#endif /* O_NONBLOCK */
#endif /* O_NDELAY */
#endif /* O_NONBLOCK */
#ifdef HAVE_PTYS
/* On some OSs with ptys, when the process on one end of
a pty exits, the other end gets an error reading with
@ -4829,11 +4829,17 @@ wait_reading_process_output (time_limit, microsecs, read_kbd, do_display,
get a SIGCHLD).
However, it has been known to happen that the SIGCHLD
got lost. So raise the signl again just in case.
got lost. So raise the signal again just in case.
It can't hurt. */
else if (nread == -1 && errno == EIO)
kill (getpid (), SIGCHLD);
#endif /* HAVE_PTYS */
{
/* Clear the descriptor now, so we only raise the signal once. */
FD_CLR (channel, &input_wait_mask);
FD_CLR (channel, &non_keyboard_wait_mask);
kill (getpid (), SIGCHLD);
}
#endif /* HAVE_PTYS */
/* If we can detect process termination, don't consider the process
gone just because its pipe is closed. */
#ifdef SIGCHLD
@ -6514,11 +6520,6 @@ sigchld_handler (signo)
/* Keep trying to get a status until we get a definitive result. */
do
{
/* For some reason, this sleep() prevents Emacs from sending
loadavg to 5-8(!) for ~10 seconds.
See http://thread.gmane.org/gmane.emacs.devel/67722 or
http://www.google.com/search?q=busyloop+in+sigchld_handler */
usleep (1000);
errno = 0;
pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
}