diff src/sighandlers.cc @ 2626:b35a5cd8107f

[project @ 1997-01-27 01:41:30 by jwe]
author jwe
date Mon, 27 Jan 1997 01:43:16 +0000
parents c454cd888ada
children f4d0604cbcc4
line wrap: on
line diff
--- a/src/sighandlers.cc
+++ b/src/sighandlers.cc
@@ -80,13 +80,33 @@
 #endif
 
 #if defined (__EMX__)
-#define MAYBE_UNBLOCK_SIGNAL(sig) \
+#define MAYBE_ACK_SIGNAL(sig) \
   octave_set_signal_handler (sig, SIG_ACK)
 #else
-#define MAYBE_UNBLOCK_SIGNAL(sig) \
+#define MAYBE_ACK_SIGNAL(sig) \
   do { } while (0)
 #endif
 
+// The following signal blocking stuff is stolen from bash:
+
+#define BLOCK_SIGNAL(sig, nvar, ovar) \
+  do \
+    { \
+      sigemptyset (&nvar); \
+      sigaddset (&nvar, sig); \
+      sigemptyset (&ovar); \
+      sigprocmask (SIG_BLOCK, &nvar, &ovar); \
+    } \
+  while (0)
+
+#if defined (HAVE_POSIX_SIGNALS)
+#define BLOCK_CHILD(nvar, ovar) BLOCK_SIGNAL (SIGCHLD, nvar, ovar)
+#define UNBLOCK_CHILD(ovar) sigprocmask (SIG_SETMASK, &ovar, 0)
+#else
+#define BLOCK_CHILD(nvar, ovar) ovar = sigblock (sigmask (SIGCHLD))
+#define UNBLOCK_CHILD(ovar) sigsetmask (ovar)
+#endif
+
 void
 octave_save_signal_mask (void)
 {
@@ -189,14 +209,22 @@
 static RETSIGTYPE
 sigchld_handler (int /* sig */)
 {
-#if defined (__EMX__)
   volatile octave_interrupt_handler *saved_interrupt_handler
      = octave_ignore_interrupts ();
 
+  // I wonder if this is really right, or if SIGCHLD should just be
+  // blocked on OS/2 systems the same as for systems with POSIX signal
+  // functions.
+
+#if defined (__EMX__)
   volatile sig_handler *saved_sigchld_handler
-    = octave_set_signal_hanlder (SIGCHLD, SIG_IGN);
+    = octave_set_signal_handler (SIGCHLD, SIG_IGN);
 #endif
 
+  sigset_t set, oset;
+
+  BLOCK_CHILD (set, oset);
+
   int n = octave_child_list::length ();
 
   if (n == 0)
@@ -230,13 +258,15 @@
 	}
     }
 
-#if defined (__EMX__)
   octave_set_interrupt_handler (saved_interrupt_handler);
 
+  UNBLOCK_CHILD (oset);
+
+#ifdef __EMX__
   octave_set_signal_handler (SIGCHLD, saved_sigchld_handler);
 #endif
 
-  MAYBE_UNBLOCK_SIGNAL (SIGCHLD);
+  MAYBE_ACK_SIGNAL (SIGCHLD);
 
   MAYBE_REINSTALL_SIGHANDLER (SIGCHLD, sigchld_handler);
 
@@ -247,7 +277,7 @@
 static RETSIGTYPE
 sigfpe_handler (int /* sig */)
 {
-  MAYBE_UNBLOCK_SIGNAL (SIGFPE);
+  MAYBE_ACK_SIGNAL (SIGFPE);
 
   MAYBE_REINSTALL_SIGHANDLER (SIGFPE, sigfpe_handler);
 
@@ -272,7 +302,7 @@
 static RETSIGTYPE
 sigint_handler (int sig)
 {
-  MAYBE_UNBLOCK_SIGNAL (sig);
+  MAYBE_ACK_SIGNAL (sig);
 
   MAYBE_REINSTALL_SIGHANDLER (sig, sigint_handler);
 
@@ -288,7 +318,7 @@
 static RETSIGTYPE
 sigpipe_handler (int /* sig */)
 {
-  MAYBE_UNBLOCK_SIGNAL (SIGPIPE);
+  MAYBE_ACK_SIGNAL (SIGPIPE);
 
   MAYBE_REINSTALL_SIGHANDLER (SIGPIPE, sigpipe_handler);