]> git.eshelyaron.com Git - emacs.git/commitdiff
Chain glib's SIGCHLD handler from Emacs's (Bug#14474).
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 5 Jun 2013 17:04:13 +0000 (10:04 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 5 Jun 2013 17:04:13 +0000 (10:04 -0700)
* process.c (dummy_handler): New function.
(lib_child_handler): New static var.
(handle_child_signal): Invoke it.
(catch_child_signal): If a library has set up a signal handler,
save it into lib_child_handler.
(init_process_emacs): If using glib and not on Windows, tickle glib's
child-handling code so that it initializes its private SIGCHLD handler.
* syssignal.h (SA_SIGINFO): Default to 0.
* xterm.c (x_term_init): Remove D-bus hack that I installed on May
31; it should no longer be needed now.

src/ChangeLog
src/process.c
src/syssignal.h
src/xterm.c

index 67b1b482f3fb5b711080e065456245bb6be5e3c8..ac0563c6bdd5ef0820fdd0bbe8ee3f8c45fbaece 100644 (file)
@@ -1,3 +1,17 @@
+2013-06-05  Paul Eggert  <eggert@cs.ucla.edu>
+
+       Chain glib's SIGCHLD handler from Emacs's (Bug#14474).
+       * process.c (dummy_handler): New function.
+       (lib_child_handler): New static var.
+       (handle_child_signal): Invoke it.
+       (catch_child_signal): If a library has set up a signal handler,
+       save it into lib_child_handler.
+       (init_process_emacs): If using glib and not on Windows, tickle glib's
+       child-handling code so that it initializes its private SIGCHLD handler.
+       * syssignal.h (SA_SIGINFO): Default to 0.
+       * xterm.c (x_term_init): Remove D-bus hack that I installed on May
+       31; it should no longer be needed now.
+
 2013-06-05  Michael Albinus  <michael.albinus@gmx.de>
 
        * emacs.c (main) [HAVE_GFILENOTIFY]: Call globals_of_gfilenotify.
index 33035078df90e5e45b62458be74dfd102fe0717b..6ae02494d368763ed12d9369163dab03ef8da922 100644 (file)
@@ -6100,6 +6100,12 @@ process has been transmitted to the serial port.  */)
    might inadvertently reap a GTK-created process that happened to
    have the same process ID.  */
 
+/* LIB_CHILD_HANDLER is a SIGCHLD handler that Emacs calls while doing
+   its own SIGCHLD handling.  On POSIXish systems, glib needs this to
+   keep track of its own children.  The default handler does nothing.  */
+static void dummy_handler (int sig) {}
+static signal_handler_t volatile lib_child_handler = dummy_handler;
+
 /* Handle a SIGCHLD signal by looking for known child processes of
    Emacs whose status have changed.  For each one found, record its
    new status.
@@ -6184,6 +6190,8 @@ handle_child_signal (int sig)
            }
        }
     }
+
+  lib_child_handler (sig);
 }
 
 static void
@@ -7035,9 +7043,13 @@ static
 void
 catch_child_signal (void)
 {
-  struct sigaction action;
+  struct sigaction action, old_action;
   emacs_sigaction_init (&action, deliver_child_signal);
-  sigaction (SIGCHLD, &action, 0);
+  sigaction (SIGCHLD, &action, &old_action);
+  eassert (! (old_action.sa_flags & SA_SIGINFO));
+  if (old_action.sa_handler != SIG_DFL && old_action.sa_handler != SIG_IGN
+      && old_action.sa_handler != deliver_child_signal)
+    lib_child_handler = old_action.sa_handler;
 }
 
 \f
@@ -7055,6 +7067,11 @@ init_process_emacs (void)
   if (! noninteractive || initialized)
 #endif
     {
+#if defined HAVE_GLIB && !defined WINDOWSNT
+      /* Tickle glib's child-handling code so that it initializes its
+        private SIGCHLD handler.  */
+      g_source_unref (g_child_watch_source_new (0));
+#endif
       catch_child_signal ();
     }
 
index d7399c6cb8c9c96da2f6b1aaac16315bd0cc6810..45ea8f1af3c693a1b75e5d7231debbafe946e786 100644 (file)
@@ -50,6 +50,10 @@ char const *safe_strsignal (int) ATTRIBUTE_CONST;
 # define NSIG NSIG_MINIMUM
 #endif
 
+#ifndef SA_SIGINFO
+# define SA_SIGINFO 0
+#endif
+
 #ifndef emacs_raise
 # define emacs_raise(sig) raise (sig)
 #endif
index 7038de7039fed56eb7280d38e7415b06c6917093..7505aa3936b71e1bbe362b457cf1585ea85371ab 100644 (file)
@@ -9897,13 +9897,6 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name)
 
         XSetLocaleModifiers ("");
 
-       /* If D-Bus is not already configured, inhibit D-Bus autolaunch,
-          as autolaunch can mess up Emacs's SIGCHLD handler.
-          FIXME: Rewrite subprocess handlers to use glib's child watchers.
-          See Bug#14474.  */
-       if (! egetenv ("DBUS_SESSION_BUS_ADDRESS"))
-         xputenv ("DBUS_SESSION_BUS_ADDRESS=unix:path=/dev/null");
-
         /* Emacs can only handle core input events, so make sure
            Gtk doesn't use Xinput or Xinput2 extensions.  */
        xputenv ("GDK_CORE_DEVICE_EVENTS=1");