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.
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;
}
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;
}
* @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
*
* 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
#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) {
fll_program_print_signal_received(&main->program.warning, main->program.signal_received);
}
- return;
+ return F_okay;
}
f_signal_set_fill(&main->program.signal.set);
}
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)) {
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_
* 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
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_
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_