]> git.eshelyaron.com Git - emacs.git/commitdiff
Clean up SIGCHLD handling a bit.
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 22 Jun 2013 19:01:47 +0000 (12:01 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 22 Jun 2013 19:01:47 +0000 (12:01 -0700)
* process.c, process.h (catch_child_signal):
Now always extern, even if !NS_IMPL_GNUSTEP.
* process.c (catch_child_signal): Move glib tickler here from
init_process_emacs, so that it's done earlier in Emacs
initialization.  Also move the noninteractive && !initialized
check here from init_process_emacs.  This is all a bit cleaner for
GNUish platforms, and I hope it works around the Cygwin bug.
* sysdep.c (init_signals): Invoke catch_child_signal here, so
that glib signal handling is tickled before glib creates threads.

Fixes: debbugs:14569
src/ChangeLog
src/process.c
src/process.h
src/sysdep.c

index 36709eb51073e1342ebf9cfb6dd340c7e7d76848..202331dac53e4032152e150a4d8e635b1d361759 100644 (file)
@@ -1,5 +1,16 @@
 2013-06-22  Paul Eggert  <eggert@cs.ucla.edu>
 
+       Clean up SIGCHLD handling a bit (Bug#14569).
+       * process.c, process.h (catch_child_signal):
+       Now always extern, even if !NS_IMPL_GNUSTEP.
+       * process.c (catch_child_signal): Move glib tickler here from
+       init_process_emacs, so that it's done earlier in Emacs
+       initialization.  Also move the noninteractive && !initialized
+       check here from init_process_emacs.  This is all a bit cleaner for
+       GNUish platforms, and I hope it works around the Cygwin bug.
+       * sysdep.c (init_signals): Invoke catch_child_signal here, so
+       that glib signal handling is tickled before glib creates threads.
+
        * process.c (wait_reading_process_output): Avoid int overflow
        when reading more than 2 GiB total from a process.
 
index 0631cb732bfa6bc86db47ec4d993a30d8d04e035..3e31dede4c2c753de281d465de37113def351ead 100644 (file)
@@ -7060,13 +7060,29 @@ integer or floating point values.
   return system_process_attributes (pid);
 }
 
-#ifndef NS_IMPL_GNUSTEP
-static
-#endif
+/* Arrange to catch SIGCHLD if needed.  */
+
 void
 catch_child_signal (void)
 {
   struct sigaction action, old_action;
+
+#if !defined CANNOT_DUMP
+  if (noninteractive && !initialized)
+    return;
+#endif
+
+#if defined HAVE_GLIB && !defined WINDOWSNT
+  /* Tickle glib's child-handling code.  Ask glib to wait for Emacs itself;
+     this should always fail, but is enough to initialize glib's
+     private SIGCHLD handler, allowing the code below to copy it into
+     LIB_CHILD_HANDLER.
+
+     Do this early in Emacs initialization, before glib creates
+     threads, to avoid race condition bugs in Cygwin glib.  */
+  g_source_unref (g_child_watch_source_new (getpid ()));
+#endif
+
   emacs_sigaction_init (&action, deliver_child_signal);
   sigaction (SIGCHLD, &action, &old_action);
   eassert (! (old_action.sa_flags & SA_SIGINFO));
@@ -7086,19 +7102,6 @@ init_process_emacs (void)
 
   inhibit_sentinels = 0;
 
-#ifndef CANNOT_DUMP
-  if (! noninteractive || initialized)
-#endif
-    {
-#if defined HAVE_GLIB && !defined WINDOWSNT
-      /* Tickle glib's child-handling code.  Ask glib to wait for Emacs itself;
-        this should always fail, but is enough to initialize glib's
-        private SIGCHLD handler.  */
-      g_source_unref (g_child_watch_source_new (getpid ()));
-#endif
-      catch_child_signal ();
-    }
-
   FD_ZERO (&input_wait_mask);
   FD_ZERO (&non_keyboard_wait_mask);
   FD_ZERO (&non_process_wait_mask);
index 0c4e17e68cff764baf4d6f3b81aa86891886e844..9455df18bebe7f8c2a472cf803bb83225b8e4a81 100644 (file)
@@ -217,8 +217,6 @@ extern void add_read_fd (int fd, fd_callback func, void *data);
 extern void delete_read_fd (int fd);
 extern void add_write_fd (int fd, fd_callback func, void *data);
 extern void delete_write_fd (int fd);
-#ifdef NS_IMPL_GNUSTEP
 extern void catch_child_signal (void);
-#endif
 
 INLINE_HEADER_END
index 1d3e646d359c3ae568e43e8a03ad7d71a57139a4..c2769865b5dda7771c391aa5b8508018e41d0408 100644 (file)
@@ -1901,6 +1901,8 @@ init_signals (bool dumping)
       sigaction (SIGFPE, &action, 0);
     }
 
+  catch_child_signal ();
+
 #ifdef SIGUSR1
   add_user_signal (SIGUSR1, "sigusr1");
 #endif