From: Kevin Day Date: Sun, 3 Aug 2025 01:53:16 +0000 (-0500) Subject: Update: The controller program signal handler should handle reaping as well. X-Git-Tag: 0.7.3~40 X-Git-Url: https://www.git.kevux.org/?a=commitdiff_plain;h=934c01eadc5c4c88004455d04d091263b2f6792d;p=controller Update: The controller program signal handler should handle reaping as well. I forgot that I have two different signal handlers to update when working on commit f17cb61f534f9ead8ee4effa858c86f9faf09dea. The controller program, like the init program, should reap zombie child processes. --- diff --git a/sources/c/program/controller/init/signal.c b/sources/c/program/controller/init/signal.c index 8133620..c62687b 100644 --- a/sources/c/program/controller/init/signal.c +++ b/sources/c/program/controller/init/signal.c @@ -30,7 +30,6 @@ extern "C" { // Send F_signal_reserved_35 to cleanup process to reap child processes. if (information.si_signo == F_signal_child || information.si_signo == F_signal_reserved_35) { - if (f_thread_mutex_lock(&main->thread.lock.reap) == F_okay) { f_thread_condition_signal_all(&main->thread.lock.reap_condition); f_thread_mutex_unlock(&main->thread.lock.reap); diff --git a/sources/c/program/controller/main/thread/signal.c b/sources/c/program/controller/main/thread/signal.c index 7810d36..7caa637 100644 --- a/sources/c/program/controller/main/thread/signal.c +++ b/sources/c/program/controller/main/thread/signal.c @@ -28,9 +28,24 @@ extern "C" { // Prevent thread from being interrupted and auto-cancelled. f_thread_cancel_state_set(PTHREAD_CANCEL_DEFERRED, 0); + // Send F_signal_reserved_35 to cleanup process to reap child processes. + if (information.si_signo == F_signal_child || information.si_signo == F_signal_reserved_35) { + if (f_thread_mutex_lock(&main->thread.lock.reap) == F_okay) { + f_thread_condition_signal_all(&main->thread.lock.reap_condition); + f_thread_mutex_unlock(&main->thread.lock.reap); + } + + continue; + } + if (information.si_signo == F_signal_interrupt || information.si_signo == F_signal_abort || information.si_signo == F_signal_quit || information.si_signo == F_signal_termination) { main->thread.signal = information.si_signo; + if (f_thread_mutex_lock_try(&main->thread.lock.reap) == F_okay) { + f_thread_condition_signal_all(&main->thread.lock.reap_condition); + f_thread_mutex_unlock(&main->thread.lock.reap); + } + controller_thread_instance_cancel(main, is_normal, controller_thread_cancel_signal_e); break;