The general rule is to check each arbitrarily large loop or between long running functions for interrupt.
Each lock attempt is also checked for interrupt before locking.
This is resulting in a bit too many checks (which are to some extend expensive because checking requires a lock).
Many of these checks are back to back because some explicit checks are called before normal locking requests (which themselves perform explicit checks).
void controller_init_signal_thread(controller_t * const main, const uint8_t is_normal, f_thread_attribute_t * const attribute) {
if (!main || !attribute) return;
- if (!controller_thread_enable_is_normal(&main->thread, is_normal)) return;
if (!(main->setting.flag & controller_main_flag_interruptible_d)) return;
siginfo_t information;
}
} // for
+ if (!controller_thread_enable_is_normal(&main->thread, is_entry)) {
+ entry->status = F_status_set_error(F_interrupt);
+ }
+
if (is_entry && F_status_set_fine(state.status) == F_interrupt) {
entry->status = controller_status_simplify_error(F_status_set_fine(state.status));
for (j = 0; j < entry->items.array[i].actions.used; ++j) {
- if (!controller_thread_enable_is_normal(&main->thread, is_entry)) {
- entry->status = controller_status_simplify_error(F_interrupt);
-
- return F_status_set_error(F_interrupt);
- }
-
action = &entry->items.array[i].actions.array[j];
// Only process actions that don't already have an error.
} // for
} // for
- if (!controller_thread_enable_is_normal(&main->thread, is_entry)) return F_status_set_error(F_interrupt);
-
controller_rule_t *rules[total];
memset(rules, 0, sizeof(controller_rule_t *) * total);
else if (f_compare_dynamic(controller_settings_s, actions->array[cache->ats.array[at_j]].parameters.array[0]) == F_equal_to) continue;
// Walk though each items and check to see if the item actually exists.
- for (i = 1; i < entry->items.used && controller_thread_enable_is_normal(&main->thread, is_entry); ++i) {
+ for (i = 1; i < entry->items.used; ++i) {
if (f_compare_dynamic(entry->items.array[i].name, actions->array[cache->ats.array[at_j]].parameters.array[0]) == F_equal_to) {
controller_print_message_entry_item_rule(&main->program.message, entry, entry_action, is_entry, alias_rule);
}
- if (!controller_thread_enable_is_normal(&main->thread, is_entry)) break;
-
// The Rule is not yet loaded, ensure that it is loaded (but not when using controlfile/initfile).
if (status != F_true) {
if (main->setting.flag & controller_main_flag_single_d) {
cache->action.line_action = cache_line_action;
cache->action.line_item = cache_line_item;
- if (F_status_set_fine(status) == F_interrupt || !controller_thread_enable_is_normal(&main->thread, is_entry)) break;
+ if (F_status_set_fine(status) == F_interrupt) break;
if (F_status_is_error(status)) {
if (main->program.error.verbosity > f_console_verbosity_quiet_e) {
if (!main) return F_status_set_error(F_parameter);
- if (!controller_thread_enable_is_normal(&main->thread, is_normal)) return F_status_set_error(F_interrupt);
-
f_status_t status = controller_lock_read_standard(is_normal, controller_lock_check_flag_yes_d, &main->thread, &main->thread.lock.instance);
if (status != F_okay) {
f_status_t controller_instance_wait(controller_instance_t * const instance) {
if (!instance || !instance->main) return F_status_set_error(F_parameter);
- if (!controller_thread_is_enabled_instance(instance)) return F_status_set_error(F_interrupt);
f_time_spec_t time;
status = controller_mutex_lock_instance(instance, &instance->wait);
if (F_status_is_error(status)) break;
- if (!controller_thread_is_enabled_instance(instance)) {
- f_thread_mutex_unlock(&instance->wait.mutex);
-
- return F_status_set_error(F_interrupt);
- }
-
if (count < controller_thread_timeout_wait_1_before_d) {
controller_time_now(controller_thread_timeout_wait_1_seconds_d, controller_thread_timeout_wait_1_nanoseconds_d, &time);
}
++count;
}
- } while (status == F_time && controller_thread_is_enabled_instance(instance));
+ } while (status == F_time);
return status;
}
// 0x1 = No Item, 0x2 = No action.
uint8_t execute_nothing = 0x3;
- for (i = 0; i < instance->rule.items.used && controller_thread_is_enabled_instance(instance); ++i) {
+ for (i = 0; i < instance->rule.items.used; ++i) {
if (instance->rule.items.array[i].type == controller_rule_item_type_settings_e) continue;
for (j = 0; j < instance->rule.items.array[i].actions.used; ++j) {
- if (!controller_thread_is_enabled_instance(instance)) {
- status = F_status_set_error(F_interrupt);
-
- break;
- }
-
if (instance->rule.items.array[i].actions.array[j].type != action) continue;
execute_nothing &= ~0x2;
controller_t * const main = instance->main;
controller_rule_rerun_item_t * const rerun_item = result ? &item->reruns[action].failure : &item->reruns[action].success;
- if (!controller_thread_is_enabled_instance(instance)) return -2;
-
if (!rerun_item->max || rerun_item->count < rerun_item->max) {
+ if (!controller_thread_is_enabled_instance(instance)) return -2;
+
controller_main_print_debug_rule_execute_rerun(&main->program.output, instance, rerun_item, action, F_status_debug_source_d);
if (rerun_item->delay) {
status = controller_time_sleep_nanoseconds(instance->main, delay);
if (F_status_is_error(status) || status == F_interrupt) return -1;
}
-
- if (!controller_thread_is_enabled_instance(instance)) return -2;
}
if (item->reruns[action].is & (result ? controller_rule_rerun_is_failure_reset_d : controller_rule_rerun_is_success_reset_d)) {
// i==0 is need, i==1 is want, i==2 is wish.
// Loop through all dependencies: wait for depedency, execute dependency, fail due to missing required dependency, or skip unrequired missing dependencies.
- for (i = 0; i < 3 && controller_thread_is_enabled_instance(instance); ++i) {
+ for (i = 0; i < 3; ++i) {
- for (j = 0; j < dynamics[i]->used && controller_thread_is_enabled_instance(instance); ++j) {
+ for (j = 0; j < dynamics[i]->used; ++j) {
dependency = 0;
found = F_false;
}
}
- if (!controller_thread_is_enabled_instance(instance)) {
- f_thread_unlock(&dependency->active);
-
- break;
- }
-
if (F_status_is_error(status_lock)) {
status = status_lock;
- if (F_status_set_fine(status_lock) != F_interrupt) {
- controller_print_error_rule_instance_need_want_wish(&main->program.error, instance, strings[i], alias_other_buffer, "due to lock failure", F_status_debug_source_d);
- }
+ if (F_status_set_fine(status_lock) == F_interrupt) break;
+
+ controller_print_error_rule_instance_need_want_wish(&main->program.error, instance, strings[i], alias_other_buffer, "due to lock failure", F_status_debug_source_d);
}
else if (controller_rule_status_is_error(instance->action, *rule)) {
if (i == 0 || i == 1) {
}
if (status == F_child || F_status_set_fine(status) == F_interrupt) return status;
- if (!controller_thread_is_enabled_instance(instance)) return F_status_set_error(F_interrupt);
if ((instance->options & controller_instance_option_wait_d) && F_status_is_error_not(status) && (instance->options & controller_instance_option_validate_d)) {
status_lock = controller_rule_wait_all_instance_type(main, instance->type, F_false);
f_status_t controller_rule_instance_begin(controller_t * const main, controller_cache_t * const cache, const uint8_t options_force, const f_string_static_t alias_rule, const uint8_t action, const uint8_t options, const uint8_t type, const controller_rules_t stack) {
if (!main || !cache) return F_status_set_error(F_parameter);
- if (!controller_thread_is_enabled_instance_type(&main->thread, type)) return F_status_set_error(F_interrupt);
controller_instance_t *instance = 0;
status = controller_rule_instance_perform_stack_verify(instance, rule);
- if (!controller_thread_is_enabled_instance(instance)) return F_status_set_error(F_interrupt);
-
if (F_status_is_error_not(status)) {
status = controller_rule_instance_perform_stack_rule_append(instance, rule);
void controller_thread_signal(controller_t * const main, const uint8_t is_normal, f_thread_attribute_t * const attribute) {
if (!main || !attribute) return;
- if (!controller_thread_enable_is_normal(&main->thread, is_normal)) return;
if (!(main->setting.flag & controller_main_flag_interruptible_d)) return;
siginfo_t information;