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

Reply via email to