]> Kevux Git Server - controller/commitdiff
Bugfix: Final signal thread deadlocks on interrupt.
authorKevin Day <Kevin@kevux.org>
Tue, 29 Jul 2025 03:19:22 +0000 (22:19 -0500)
committerKevin Day <Kevin@kevux.org>
Tue, 29 Jul 2025 03:19:22 +0000 (22:19 -0500)
This is the same situation as seen in commit 3e9f838e9f67f9bb1a7042e1c24d3f169aa037d7.

Set the thread cancel state to `PTHREAD_CANCEL_ASYNCHRONOUS` while waiting for a signal.
Set the thread cancel state back to `PTHREAD_CANCEL_DEFERRED,` while not waiting for a signal.

sources/c/program/controller/main/thread/signal.c

index fb633fc030bd54de81f07f763f43b21ccb72be07..842e1f2cfb5d9af4c338a111dfb0dde4fb1a2d54 100644 (file)
@@ -20,8 +20,14 @@ extern "C" {
 
       controller_time_now(controller_thread_timeout_exit_ready_seconds_d, controller_thread_timeout_exit_ready_nanoseconds_d, &time);
 
+      // Allow thread to be interrupted and auto-cancelled while sleeping.
+      f_thread_cancel_state_set(PTHREAD_CANCEL_ASYNCHRONOUS, 0);
+
       if (f_signal_wait_until(&main->program.signal.set, &time, &information) == F_time_out) continue;
 
+      // Prevent thread from being interrupted and auto-cancelled.
+      f_thread_cancel_state_set(PTHREAD_CANCEL_DEFERRED, 0);
+
       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;