Mercurial > hg > octave-lyh
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 +++ b/src/sighandlers.cc @@ -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) */