On Tue, Jul 15, 2025 at 09:14:28AM +0200, Gabriele Monaco wrote:
> static inline bool
> \
> da_event_##name(struct da_monitor *da_mon, enum events_##name event)
> \
> {
> \
> - type curr_state = da_monitor_curr_state_##name(da_mon);
> \
> - type next_state = model_get_next_state_##name(curr_state, event);
> \
> -
> \
> - if (next_state != INVALID_STATE) {
> \
> - da_monitor_set_state_##name(da_mon, next_state);
> \
> -
> \
> - trace_event_##name(model_get_state_name_##name(curr_state),
> \
> - model_get_event_name_##name(event),
> \
> - model_get_state_name_##name(next_state),
> \
> - model_is_final_state_##name(next_state));
> \
> -
> \
> - return true;
> \
> + enum states_##name curr_state, next_state;
> \
> +
> \
> + curr_state = READ_ONCE(da_mon->curr_state);
> \
> + for (int i = 0; i < MAX_DA_RETRY_RACING_EVENTS; i++) {
> \
> + next_state = model_get_next_state_##name(curr_state, event);
> \
> + if (next_state == INVALID_STATE)
> \
> + goto out_react;
> \
> + if (likely(try_cmpxchg(&da_mon->curr_state, &curr_state,
> next_state))) \
> + goto out_success;
> \
> }
> \
> + /* Special invalid transition if we run out of retries. */
> \
> + curr_state = INVALID_STATE;
> \
>
> \
> +out_react:
> \
> cond_react_##name(curr_state, event);
> \
>
> \
> trace_error_##name(model_get_state_name_##name(curr_state),
> \
> model_get_event_name_##name(event));
> \If I understand correctly, if after 3 tries and we still fail to change the state, we will invoke the reactor and trace_error? Doesn't that cause a false positive? Because it is not a violation of the model, it is just a race making us fail to change the state. Same below. Also, I wouldn't use goto unless necessary. Perhaps it is better to put the code at "out_react:" and "out_success:" into the loop. But that's just my personal preference, up to you. Nam
