# 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 -r c139672c9a2f -r f359cfc6e24d src/ChangeLog --- a/src/ChangeLog Sun Jan 16 22:17:57 2011 -0800 +++ b/src/ChangeLog Mon Jan 17 04:58:42 2011 -0500 @@ -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 -r c139672c9a2f -r f359cfc6e24d src/sighandlers.cc --- 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) */