From: Kevin Day Date: Sun, 10 Aug 2025 02:22:48 +0000 (-0500) Subject: Bugfix: Do not use the main setting status with threads. X-Git-Tag: 0.7.3~36 X-Git-Url: https://www.git.kevux.org/?a=commitdiff_plain;h=e0e8e068c0b33ca730fb709063b7dd23e468fc86;p=controller Bugfix: Do not use the main setting status with threads. 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. --- diff --git a/sources/c/program/controller/controller/main.c b/sources/c/program/controller/controller/main.c index ffc0948..2877989 100644 --- a/sources/c/program/controller/controller/main.c +++ b/sources/c/program/controller/controller/main.c @@ -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; } diff --git a/sources/c/program/controller/init/main.c b/sources/c/program/controller/init/main.c index 9c79927..df289e3 100644 --- a/sources/c/program/controller/init/main.c +++ b/sources/c/program/controller/init/main.c @@ -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; } diff --git a/sources/c/program/controller/main/entry.h b/sources/c/program/controller/main/entry.h index fa98429..4515958 100644 --- a/sources/c/program/controller/main/entry.h +++ b/sources/c/program/controller/main/entry.h @@ -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 diff --git a/sources/c/program/controller/main/path.h b/sources/c/program/controller/main/path.h index 56b18da..d8d2426 100644 --- a/sources/c/program/controller/main/path.h +++ b/sources/c/program/controller/main/path.h @@ -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 diff --git a/sources/c/program/controller/main/process.c b/sources/c/program/controller/main/process.c index 57d4d42..b87347e 100644 --- a/sources/c/program/controller/main/process.c +++ b/sources/c/program/controller/main/process.c @@ -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_ diff --git a/sources/c/program/controller/main/process.h b/sources/c/program/controller/main/process.h index 5ef9a44..cc27edd 100644 --- a/sources/c/program/controller/main/process.h +++ b/sources/c/program/controller/main/process.h @@ -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 diff --git a/sources/c/program/controller/main/thread/signal.c b/sources/c/program/controller/main/thread/signal.c index e5dd9fa..28865be 100644 --- a/sources/c/program/controller/main/thread/signal.c +++ b/sources/c/program/controller/main/thread/signal.c @@ -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_