changeset 17569:9d0992c6df30

arrange to pass signals to the GUI subprocess * sighandlers.h, sighandlers.cc (gui_pid): New static variable. (gui_driver_sig_handler, install_gui_driver_signal_handlers): New functions. * octave-gui.cc (dissociate_terminal): Call install_gui_driver_signal_handlers from parent process.
author John W. Eaton <jwe@octave.org>
date Fri, 04 Oct 2013 15:26:10 -0400
parents 1b388d922e6b
children 1c7d768c3847
files libgui/src/octave-gui.cc libinterp/corefcn/sighandlers.cc libinterp/corefcn/sighandlers.h
diffstat 3 files changed, 137 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/libgui/src/octave-gui.cc	Fri Oct 04 13:53:25 2013 -0400
+++ b/libgui/src/octave-gui.cc	Fri Oct 04 15:26:10 2013 -0400
@@ -38,8 +38,11 @@
 
 #include "lo-utils.h"
 #include "oct-env.h"
+#include "oct-syscalls.h"
 #include "syswait.h"
 
+#include "sighandlers.h"
+
 #include "welcome-wizard.h"
 #include "resource-manager.h"
 #include "main-window.h"
@@ -73,8 +76,7 @@
     {
       // Parent
 
-      // FIXME -- we should catch signals and pass them on to the child
-      // process in some way, possibly translating SIGINT to SIGTERM.
+      install_gui_driver_signal_handlers (pid);
 
       int status;
 
--- a/libinterp/corefcn/sighandlers.cc	Fri Oct 04 13:53:25 2013 -0400
+++ b/libinterp/corefcn/sighandlers.cc	Fri Oct 04 15:26:10 2013 -0400
@@ -577,6 +577,137 @@
 
 }
 
+static pid_t gui_pid = 0;
+
+static void
+gui_driver_sig_handler (int sig)
+{
+  if (gui_pid > 0)
+    octave_syscalls::kill (gui_pid, sig);
+}
+
+void
+install_gui_driver_signal_handlers (pid_t pid)
+{
+  gui_pid = pid;
+
+#ifdef SIGINT
+  octave_set_signal_handler (SIGINT, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGBREAK
+  octave_set_signal_handler (SIGBREAK, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGABRT
+  octave_set_signal_handler (SIGABRT, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGALRM
+  octave_set_signal_handler (SIGALRM, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGBUS
+  octave_set_signal_handler (SIGBUS, gui_driver_sig_handler);
+#endif
+
+  // SIGCHLD
+  // SIGCLD
+  // SIGCONT
+
+#ifdef SIGEMT
+  octave_set_signal_handler (SIGEMT, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGFPE
+  octave_set_signal_handler (SIGFPE, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGHUP
+  octave_set_signal_handler (SIGHUP, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGILL
+  octave_set_signal_handler (SIGILL, gui_driver_sig_handler);
+#endif
+
+  // SIGINFO
+  // SIGINT
+
+#ifdef SIGIOT
+  octave_set_signal_handler (SIGIOT, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGLOST
+  octave_set_signal_handler (SIGLOST, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGPIPE
+  octave_set_signal_handler (SIGPIPE, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGPOLL
+  octave_set_signal_handler (SIGPOLL, gui_driver_sig_handler);
+#endif
+
+  // SIGPROF
+  // SIGPWR
+
+#ifdef SIGQUIT
+  octave_set_signal_handler (SIGQUIT, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGSEGV
+  octave_set_signal_handler (SIGSEGV, gui_driver_sig_handler);
+#endif
+
+  // SIGSTOP
+
+#ifdef SIGSYS
+  octave_set_signal_handler (SIGSYS, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGTERM
+  octave_set_signal_handler (SIGTERM, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGTRAP
+  octave_set_signal_handler (SIGTRAP, gui_driver_sig_handler);
+#endif
+
+  // SIGTSTP
+  // SIGTTIN
+  // SIGTTOU
+  // SIGURG
+
+#ifdef SIGUSR1
+  octave_set_signal_handler (SIGUSR1, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGUSR2
+  octave_set_signal_handler (SIGUSR2, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGVTALRM
+  octave_set_signal_handler (SIGVTALRM, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGIO
+  octave_set_signal_handler (SIGIO, gui_driver_sig_handler);
+#endif
+
+  // SIGWINCH
+
+#ifdef SIGXCPU
+  octave_set_signal_handler (SIGXCPU, gui_driver_sig_handler);
+#endif
+
+#ifdef SIGXFSZ
+  octave_set_signal_handler (SIGXFSZ, gui_driver_sig_handler);
+#endif
+
+}
+
 static octave_scalar_map
 make_sig_struct (void)
 {
--- a/libinterp/corefcn/sighandlers.h	Fri Oct 04 13:53:25 2013 -0400
+++ b/libinterp/corefcn/sighandlers.h	Fri Oct 04 15:26:10 2013 -0400
@@ -71,6 +71,8 @@
 
 extern OCTINTERP_API void install_signal_handlers (void);
 
+extern OCTINTERP_API void install_gui_driver_signal_handlers (pid_t pid);
+
 extern OCTINTERP_API void octave_signal_handler (void);
 
 extern OCTINTERP_API octave_interrupt_handler octave_catch_interrupts (void);