diff options
| author | Kim F. Storm <storm@cua.dk> | 2007-03-29 21:24:38 +0000 |
|---|---|---|
| committer | Kim F. Storm <storm@cua.dk> | 2007-03-29 21:24:38 +0000 |
| commit | 4740825c2f5fbf8e33889ee718cbe227401f7494 (patch) | |
| tree | e722bd321f07c38ed2505d6344b5d29ed0e95fbb | |
| parent | 1acc2cac84ac2aba49e0d202a667fe06187dd69b (diff) | |
| download | emacs-4740825c2f5fbf8e33889ee718cbe227401f7494.tar.gz | |
(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).
| -rw-r--r-- | src/process.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/process.c b/src/process.c index 14535eb6e1e..f012b2c058d 100644 --- a/src/process.c +++ b/src/process.c @@ -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); } |
