diff src/sighandlers.cc @ 11555:f359cfc6e24d

sighandlers.cc: wait for children in octave_signal_handler, not sigchld_handler
author John W. Eaton <jwe@octave.org>
date Mon, 17 Jan 2011 04:58:42 -0500
parents ab231f944252
children 12df7854fa7c
line wrap: on
line diff
--- a/src/sighandlers.cc	Sun Jan 16 22:17:57 2011 -0800
+++ b/src/sighandlers.cc	Mon Jan 17 04:58:42 2011 -0500
@@ -114,7 +114,22 @@
             {
 #ifdef SIGCHLD
             case SIGCHLD:
-              octave_child_list::reap ();
+              {
+                volatile octave_interrupt_handler saved_interrupt_handler
+                  = octave_ignore_interrupts ();
+
+                sigset_t set, oset;
+
+                BLOCK_CHILD (set, oset);
+
+                octave_child_list::wait ();
+
+                octave_set_interrupt_handler (saved_interrupt_handler);
+
+                UNBLOCK_CHILD (oset);
+
+                octave_child_list::reap ();
+              }
               break;
 #endif
 
@@ -227,25 +242,9 @@
 static void
 sigchld_handler (int /* sig */)
 {
-  volatile octave_interrupt_handler saved_interrupt_handler
-     = octave_ignore_interrupts ();
-
-  sigset_t set, oset;
-
-  BLOCK_CHILD (set, oset);
+  octave_signal_caught = 1;
 
-  if (octave_child_list::wait ())
-    {
-      // The status of some child changed.
-
-      octave_signal_caught = 1;
-
-      octave_signals_caught[SIGCHLD] = true;
-    }
-
-  octave_set_interrupt_handler (saved_interrupt_handler);
-
-  UNBLOCK_CHILD (oset);
+  octave_signals_caught[SIGCHLD] = true;
 }
 #endif /* defined(SIGCHLD) */