]> Kevux Git Server - controller/commitdiff
Update: The controller program signal handler should handle reaping as well.
authorKevin Day <Kevin@kevux.org>
Sun, 3 Aug 2025 01:53:16 +0000 (20:53 -0500)
committerKevin Day <Kevin@kevux.org>
Sun, 3 Aug 2025 01:53:16 +0000 (20:53 -0500)
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
sources/c/program/controller/main/thread/signal.c

index 8133620e4066e8a867c8822046fe2f7dc3c5ca05..c62687b89ad249bc1dbba61020cc1ba741bc1935 100644 (file)
@@ -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);
index 7810d361c39d6397306994112c7561f555195ae8..7caa6372778736652e4f1aec6bd08a077e76a053 100644 (file)
@@ -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;