# HG changeset patch # User John W. Eaton # Date 1295258322 18000 # Node ID f359cfc6e24d809c4cc1bdaaac1c5ddf19dee652 # Parent c139672c9a2f29e2ab0a064725334e1bb92f0e22 sighandlers.cc: wait for children in octave_signal_handler, not sigchld_handler diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2011-01-17 John W. Eaton + + * sighandlers.cc (octave_signal_handler): Wait for children here. + (sigchld_handler): Not here. + 2011-01-16 Rik * DLD-FUNCTIONS/__delaunayn__.cc, DLD-FUNCTIONS/__dispatch__.cc, diff --git a/src/sighandlers.cc b/src/sighandlers.cc --- 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 (); + octave_signal_caught = 1; - sigset_t set, oset; - - BLOCK_CHILD (set, oset); - - 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) */