control_setting_load(arguments, &data);
}
- if (!control_signal_check(&data)) {
+ if (!macro_control_signal_check(&data.program, &data.setting.state)) {
control_process(&data);
}
for (f_number_unsigned_t number = 0; index < main->program.parameters.remaining.used; ++index) {
- if (control_signal_check(main)) return;
+ if (macro_control_signal_check(&main->program, &main->setting.state)) return;
number = main->program.parameters.remaining.array[index];
#define control_signal_check_failsafe_d 20000
#endif // _di_control_signal_d_
+/**
+ * A macro wrapping the appropriate signal check function based on threaded/non-threaded support.
+ */
+#ifndef _di_control_signal_check_
+ #ifdef _di_thread_support_
+ #define macro_control_signal_check(program, state) fll_program_signal_check_loop(program, state)
+ #else
+ #define macro_control_signal_check(program, state) fll_program_signal_check_simple(program, state)
+ #endif // _di_thread_support_
+#endif // _di_control_signal_check_
+
#ifdef __cplusplus
} // extern "C"
#endif
extern "C" {
#endif
-#if !defined(_di_control_signal_check_) && defined(_di_thread_support_)
- f_status_t control_signal_check(control_main_t * const main) {
-
- if (!main) return F_false;
- if (main->program.signal_received) return F_true;
-
- if (!((++main->program.signal_check) % control_signal_check_d)) {
- if (F_status_set_fine(fll_program_standard_signal_received(&main->program)) == F_interrupt) {
- main->setting.state.status = F_status_set_error(F_interrupt);
-
- return F_true;
- }
-
- main->program.signal_check = 0;
- }
-
- return F_false;
- }
-#endif // !defined(_di_control_signal_check_) && defined(_di_thread_support_)
-
-#if !defined(_di_control_signal_check_) && !defined(_di_thread_support_)
- f_status_t control_signal_check(control_main_t * const main) {
-
- if (!main) return F_false;
-
- if (main->program.signal_received) {
- main->setting.state.status = F_status_set_error(F_interrupt);
-
- return F_true;
- }
-
- return F_false;
- }
-#endif // !defined(_di_control_signal_check_) && !defined(_di_thread_support_)
-
#if !defined(_di_control_signal_handler_) && !defined(_di_thread_support_)
void control_signal_handler(control_main_t * const main) {
#endif
/**
- * Check to see if a signal is received.
- *
- * If main.signal is non-zero, then this handles the following signals:
- * - F_signal_abort
- * - F_signal_broken_pipe
- * - F_signal_hangup
- * - F_signal_interrupt
- * - F_signal_quit
- * - F_signal_termination
- *
- * There is a threaded and a non-threaded version of this.
- * The non-threaded version checks periodically using control_signal_check_d and updates main->signal_check as needed.
- * The threaded version checks the flag state which is set by a separate thread that is blocking until signal is received.
- *
- * @param main
- * The main program and settings data.
- *
- * This does not alter main.setting.state.status.
- *
- * @return
- * F_true on signal received.
- * F_false otherwise.
- *
- * @see control_signal_handler()
- *
- * @see fll_program_standard_signal_received()
- */
-#ifndef _di_control_signal_check_
- extern f_status_t control_signal_check(control_main_t * const main);
-#endif // _di_control_signal_check_
-
-/**
* Signal handler for signals/interrupts.
*
* This blocks until an expected signal is recieved.