From 934c01eadc5c4c88004455d04d091263b2f6792d Mon Sep 17 00:00:00 2001 From: Kevin Day Date: Sat, 2 Aug 2025 20:53:16 -0500 Subject: [PATCH] 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. --- sources/c/program/controller/init/signal.c | 1 - sources/c/program/controller/main/thread/signal.c | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 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; -- 1.8.3.1