]> Kevux Git Server - controller/commitdiff
Bugfix: Do not use the main setting status with threads.
authorKevin Day <Kevin@kevux.org>
Sun, 10 Aug 2025 02:22:48 +0000 (21:22 -0500)
committerKevin Day <Kevin@kevux.org>
Sun, 10 Aug 2025 02:22:48 +0000 (21:22 -0500)
The signal thread and the other threads should not touch the main setting status.
Change the logic to ensure that the main setting status is left alone while threads are running.

sources/c/program/controller/controller/main.c
sources/c/program/controller/init/main.c
sources/c/program/controller/main/entry.h
sources/c/program/controller/main/path.h
sources/c/program/controller/main/process.c
sources/c/program/controller/main/process.h
sources/c/program/controller/main/thread/signal.c

index ffc0948a82625a5c0926801e59a6b00210183f1e..2877989114a029762f6446ebc813c8d47d82e216 100644 (file)
@@ -41,15 +41,15 @@ int main(const int argc, const f_string_t *argv, const f_string_t *envp) {
     controller_setting_load(arguments, &data);
   }
 
-  controller_process(&data);
+  const f_status_t status = controller_process(&data);
 
   controller_delete(&data);
 
   fll_program_standard_set_down(&data.program);
 
-  if (data.setting.state.status == F_child) {
+  if (status == F_child) {
     exit(data.program.child);
   }
 
-  return (F_status_is_error(data.setting.state.status) || data.setting.state.status == F_false) ? 1 : 0;
+  return (F_status_is_error(status) || status == F_false) ? 1 : 0;
 }
index 9c79927cdeb219b197d6ee601c5b80d74200457c..df289e39793f5539f310cb937102e1aca1696347 100644 (file)
@@ -44,15 +44,15 @@ int main(const int argc, const f_string_t *argv, const f_string_t *envp) {
     controller_setting_load(arguments, &data);
   }
 
-  controller_process(&data);
+  const f_status_t status = controller_process(&data);
 
   controller_delete(&data);
 
   fll_program_standard_set_down(&data.program);
 
-  if (data.setting.state.status == F_child) {
+  if (status == F_child) {
     exit(data.program.child);
   }
 
-  return (F_status_is_error(data.setting.state.status) || data.setting.state.status == F_false) ? 1 : 0;
+  return (F_status_is_error(status) || status == F_false) ? 1 : 0;
 }
index fa98429e4659ab2024e0127ba47a5715bfecbf44..451595841899cd83dbca2be2ecacc3bb8a388414 100644 (file)
@@ -22,7 +22,7 @@ extern "C" {
  * @param main
  *   The main program data.
  *
- *   This alters either main.process.entry.state or main.process.exit.state.
+ *   This does not alter main.setting.state.status.
  *
  *   Must not be NULL.
  * @param is_entry
index 56b18da0f5974bafe2542f6fa2a2fba862e4a43c..d8d2426ce4995e6810a7c0f439b9dd3080cfe036 100644 (file)
@@ -31,10 +31,7 @@ extern "C" {
  *
  *   Must not be NULL.
  *
- *   This alters setting.state.status:
- *     F_okay on success.
- *
- *     Errors (with error bit) from: fl_path_canonical().
+ *   This does not alter main.setting.state.status.
  * @param current
  *   The current path, such as process.path_current.
  * @param source
index 57d4d426b2a9ba9d1b7245f9a29a70e64ef45709..b87347eaa3ffeb6feebcfc8359743d1afad9c616 100644 (file)
@@ -5,11 +5,9 @@ extern "C" {
 #endif
 
 #ifndef _di_controller_process_
-  void controller_process(controller_t * const main) {
+  f_status_t controller_process(controller_t * const main) {
 
-    if (!main || F_status_is_error(main->setting.state.status)) return;
-
-    main->setting.state.status = F_okay;
+    if (!main || F_status_is_error(main->setting.state.status)) return F_status_set_error(F_parameter);
 
     if (main->setting.flag & controller_main_flag_version_copyright_help_d) {
       if (main->setting.flag & controller_main_flag_help_d) {
@@ -31,7 +29,7 @@ extern "C" {
         fll_program_print_signal_received(&main->program.warning, main->program.signal_received);
       }
 
-      return;
+      return F_okay;
     }
 
     f_signal_set_fill(&main->program.signal.set);
@@ -122,11 +120,9 @@ extern "C" {
     }
 
     if (status == F_child) {
-      main->setting.state.status = F_child;
-
       controller_thread_delete(&main->thread);
 
-      return;
+      return F_child;
     }
 
     if (F_status_is_error_not(status) && status != F_failure && !(main->setting.flag & controller_main_flag_validate_d) && controller_thread_enable_is(&main->thread, F_true)) {
@@ -155,19 +151,21 @@ extern "C" {
     main->thread.id_signal = 0;
 
     if (F_status_set_fine(status) == F_interrupt) {
-      main->setting.state.status = F_status_set_error(F_interrupt);
+      status = F_status_set_error(F_interrupt);
 
       if (main->thread.signal) {
         main->program.signal_received = main->thread.signal;
       }
     }
     else {
-      main->setting.state.status = F_status_is_error(status) ? F_status_set_error(F_failure) : F_okay;
+      status = F_status_is_error(status) ? F_status_set_error(F_failure) : F_okay;
     }
 
     if (main->program.signal_received) {
       fll_program_print_signal_received(&main->program.warning, main->program.signal_received);
     }
+
+    return status;
   }
 #endif // _di_controller_process_
 
index 5ef9a44eabf871fb092a0c11d14d6c976fb6b8ba..cc27edd37b370a3116eec41cf3b6c698b3c908dd 100644 (file)
@@ -34,15 +34,18 @@ extern "C" {
  *   Must not be NULL.
  *
  *   This alters main.setting.state.status:
- *     F_okay on success.
- *     F_true on success when performing verification and verify passed.
- *     F_false on success when performing verification and verify failed.
- *     F_interrupt on (exit) signal received.
  *
- *     F_parameter (with error bit) if main is NULL or setting is NULL.
+ * @return
+ *   F_child on child process exiting.
+ *   F_okay on success.
+ *
+ *   F_interrupt (with error bit) on interrupt signal received.
+ *   F_parameter (with error bit) if a parameter is invalid.
+ *
+ *   F_failure (with error bit) on any other error.
  */
 #ifndef controller_process
-  extern void controller_process(controller_t * const main);
+  extern f_status_t controller_process(controller_t * const main);
 #endif // controller_process
 
 #ifdef __cplusplus
index e5dd9fa081b75e3b3764cd3769f9d927e616380a..28865be07e0bba9b3e69f5fa962b6ed2b0013a7a 100644 (file)
@@ -58,11 +58,9 @@ extern "C" {
 
     if (!controller_thread_enable_is(&interrupt->main->thread, interrupt->is_normal)) {
       interrupt->main->program.signal_received = F_signal_abort;
-      interrupt->main->setting.state.status = F_status_set_error(F_interrupt);
     }
     else if (interrupt->main->thread.signal == F_signal_interrupt || interrupt->main->thread.signal == F_signal_abort || interrupt->main->thread.signal == F_signal_quit || interrupt->main->thread.signal == F_signal_termination) {
       interrupt->main->program.signal_received = F_signal_abort;
-      interrupt->main->setting.state.status = F_status_set_error(F_interrupt);
     }
   }
 #endif // _di_controller_thread_signal_state_fss_
@@ -78,11 +76,9 @@ extern "C" {
 
     if (!controller_thread_enable_is(&interrupt->main->thread, interrupt->is_normal)) {
       interrupt->main->program.signal_received = F_signal_abort;
-      interrupt->main->setting.state.status = F_status_set_error(F_interrupt);
     }
     else if (interrupt->main->thread.signal == F_signal_interrupt || interrupt->main->thread.signal == F_signal_abort || interrupt->main->thread.signal == F_signal_quit || interrupt->main->thread.signal == F_signal_termination) {
       interrupt->main->program.signal_received = F_signal_abort;
-      interrupt->main->setting.state.status = F_status_set_error(F_interrupt);
     }
   }
 #endif // _di_controller_thread_signal_state_iki_