changeset 76794:fbe60d04cec2

(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).
author Kim F. Storm <storm@cua.dk>
date Thu, 29 Mar 2007 21:24:38 +0000
parents 0fe998c0f487
children bcf68ba23417
files src/process.c
diffstat 1 files changed, 11 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/process.c	Thu Mar 29 21:24:20 2007 +0000
+++ b/src/process.c	Thu Mar 29 21:24:38 2007 +0000
@@ -4817,8 +4817,8 @@
 		 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 @@
 		 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 @@
       /* 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);
 	}