diff src/process.c @ 83560:738ce3540ffb

Merged from emacs@sv.gnu.org Patches applied: * emacs@sv.gnu.org/emacs--devo--0--patch-660 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-661 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-662 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-663 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-664 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-665 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-666 Fix read-only prompt problem in isearch * emacs@sv.gnu.org/emacs--devo--0--patch-667 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-668 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-669 Merge from gnus--rel--5.10 * emacs@sv.gnu.org/emacs--devo--0--patch-670 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-671 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-672 Update from CVS * emacs@sv.gnu.org/emacs--devo--0--patch-673 Update from CVS * emacs@sv.gnu.org/gnus--rel--5.10--patch-206 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-207 Merge from emacs--devo--0 * emacs@sv.gnu.org/gnus--rel--5.10--patch-208 Update from CVS git-archimport-id: lorentey@elte.hu--2004/emacs--multi-tty--0--patch-600
author Karoly Lorentey <karoly@lorentey.hu>
date Sun, 22 Apr 2007 12:12:29 +0000
parents edf631bdbb7a 2fb8fb4a9bab
children dc002877ce12
line wrap: on
line diff
--- a/src/process.c	Sun Apr 22 11:42:03 2007 +0000
+++ b/src/process.c	Sun Apr 22 12:12:29 2007 +0000
@@ -817,7 +817,7 @@
       Lisp_Object symbol;
       /* Assignment to EMACS_INT stops GCC whining about limited range
 	 of data type.  */
-      EMACS_INT pid = p->pid;;
+      EMACS_INT pid = p->pid;
 
       /* No problem storing the pid here, as it is still in Vprocess_alist.  */
       deleted_pid_list = Fcons (make_fixnum_or_float (pid),
@@ -830,7 +830,8 @@
       if (CONSP (p->status))
 	symbol = XCAR (p->status);
       if (EQ (symbol, Qsignal) || EQ (symbol, Qexit))
-	Fdelete (make_fixnum_or_float (pid), deleted_pid_list);
+	deleted_pid_list
+	  = Fdelete (make_fixnum_or_float (pid), deleted_pid_list);
       else
 #endif
 	{
@@ -1818,7 +1819,8 @@
      char **new_argv;
      Lisp_Object current_dir;
 {
-  int pid, inchannel, outchannel;
+  int inchannel, outchannel;
+  pid_t pid;
   int sv[2];
 #ifdef POSIX_SIGNALS
   sigset_t procmask;
@@ -3339,12 +3341,16 @@
 #endif
     }
 
+  immediate_quit = 0;
+
 #ifdef HAVE_GETADDRINFO
   if (res != &ai)
-    freeaddrinfo (res);
-#endif
-
-  immediate_quit = 0;
+    {
+      BLOCK_INPUT;
+      freeaddrinfo (res);
+      UNBLOCK_INPUT;
+    }
+#endif
 
   /* Discard the unwind protect for closing S, if any.  */
   specpdl_ptr = specpdl + count1;
@@ -6491,7 +6497,7 @@
 
   while (1)
     {
-      register EMACS_INT pid;
+      pid_t pid;
       WAITTYPE w;
       Lisp_Object tail;
 
@@ -6500,12 +6506,17 @@
 #define WUNTRACED 0
 #endif /* no WUNTRACED */
       /* Keep trying to get a status until we get a definitive result.  */
-      do
+      while (1)
 	{
 	  errno = 0;
 	  pid = wait3 (&w, WNOHANG | WUNTRACED, 0);
+	  if (! (pid < 0 && errno == EINTR))
+	    break;
+	  /* Avoid a busyloop: wait3 is a system call, so we do not want
+	     to prevent the kernel from actually sending SIGCHLD to emacs
+	     by asking for it all the time.  */
+	  sleep (1);
 	}
-      while (pid < 0 && errno == EINTR);
 
       if (pid <= 0)
 	{
@@ -6531,11 +6542,15 @@
       /* Find the process that signaled us, and record its status.  */
 
       /* The process can have been deleted by Fdelete_process.  */
-      tail = Fmember (make_fixnum_or_float (pid), deleted_pid_list);
-      if (!NILP (tail))
+      for (tail = deleted_pid_list; GC_CONSP (tail); tail = XCDR (tail))
 	{
-	  Fsetcar (tail, Qnil);
-	  goto sigchld_end_of_loop;
+	  Lisp_Object xpid = XCAR (tail);
+	  if ((GC_INTEGERP (xpid) && pid == (pid_t) XINT (xpid))
+	      || (GC_FLOATP (xpid) && pid == (pid_t) XFLOAT_DATA (xpid)))
+	    {
+	      XSETCAR (tail, Qnil);
+	      goto sigchld_end_of_loop;
+	    }
 	}
 
       /* Otherwise, if it is asynchronous, it is in Vprocess_alist.  */