score: Improve priority node debugging

Make sure the actions of priority aggregations are not reused while in
use.

Update #5159.
This commit is contained in:
Sebastian Huber
2024-11-20 02:30:57 +01:00
parent 133b335bae
commit 1c12047098
2 changed files with 37 additions and 2 deletions

View File

@@ -159,6 +159,7 @@ static inline void _Priority_Actions_add(
* Priority aggregations are only added to action lists, so do not care about * Priority aggregations are only added to action lists, so do not care about
* the current next pointer value. * the current next pointer value.
*/ */
_Assert( aggregation->Action.next == NULL );
aggregation->Action.next = actions->actions; aggregation->Action.next = actions->actions;
#endif #endif
actions->actions = aggregation; actions->actions = aggregation;
@@ -334,6 +335,7 @@ static inline void _Priority_Set_action_node(
Priority_Node *node Priority_Node *node
) )
{ {
_Assert( aggregation->Action.next == NULL );
aggregation->Action.node = node; aggregation->Action.node = node;
} }
@@ -348,6 +350,7 @@ static inline void _Priority_Set_action_type(
Priority_Action_type type Priority_Action_type type
) )
{ {
_Assert( aggregation->Action.next == NULL );
aggregation->Action.type = type; aggregation->Action.type = type;
} }
@@ -365,6 +368,7 @@ static inline void _Priority_Set_action(
Priority_Action_type type Priority_Action_type type
) )
{ {
_Assert( aggregation->Action.next == NULL );
aggregation->Action.node = node; aggregation->Action.node = node;
aggregation->Action.type = type; aggregation->Action.type = type;
} }
@@ -379,10 +383,21 @@ static inline void _Priority_Set_action(
* is no next action. * is no next action.
*/ */
static inline Priority_Aggregation *_Priority_Get_next_action( static inline Priority_Aggregation *_Priority_Get_next_action(
#if defined(RTEMS_DEBUG)
Priority_Aggregation *aggregation
#else
const Priority_Aggregation *aggregation const Priority_Aggregation *aggregation
#endif
) )
{ {
return aggregation->Action.next; Priority_Aggregation *next;
next = aggregation->Action.next;
#if defined(RTEMS_DEBUG)
aggregation->Action.next = NULL;
#endif
return next;
} }
#endif #endif

View File

@@ -68,6 +68,16 @@ void _Thread_queue_Do_nothing_priority_actions(
Priority_Actions *priority_actions Priority_Actions *priority_actions
) )
{ {
#if defined(RTEMS_DEBUG)
Priority_Aggregation *priority_aggregation;
priority_aggregation = _Priority_Actions_move( priority_actions );
while ( priority_aggregation != NULL ) {
priority_aggregation = _Priority_Get_next_action( priority_aggregation );
}
#endif
(void) queue; (void) queue;
_Priority_Actions_initialize_empty( priority_actions ); _Priority_Actions_initialize_empty( priority_actions );
} }
@@ -366,10 +376,17 @@ static void _Thread_queue_Priority_priority_actions(
priority_aggregation = _Priority_Actions_move( priority_actions ); priority_aggregation = _Priority_Actions_move( priority_actions );
do { do {
#if defined(RTEMS_SMP)
Priority_Aggregation *next_aggregation;
#endif
Scheduler_Node *scheduler_node; Scheduler_Node *scheduler_node;
Thread_queue_Priority_queue *priority_queue; Thread_queue_Priority_queue *priority_queue;
Priority_Action_type priority_action_type; Priority_Action_type priority_action_type;
#if defined(RTEMS_SMP)
next_aggregation = _Priority_Get_next_action( priority_aggregation );
#endif
scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation ); scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation );
priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node ); priority_queue = _Thread_queue_Priority_queue( heads, scheduler_node );
priority_action_type = priority_aggregation->Action.type; priority_action_type = priority_aggregation->Action.type;
@@ -408,7 +425,7 @@ static void _Thread_queue_Priority_priority_actions(
} }
#if defined(RTEMS_SMP) #if defined(RTEMS_SMP)
priority_aggregation = _Priority_Get_next_action( priority_aggregation ); priority_aggregation = next_aggregation;
} while ( priority_aggregation != NULL ); } while ( priority_aggregation != NULL );
#else #else
} while ( false ); } while ( false );
@@ -1366,6 +1383,9 @@ static void _Thread_queue_Priority_inherit_do_surrender(
* _Thread_Priority_perform_actions(). * _Thread_Priority_perform_actions().
*/ */
_Thread_queue_Context_add_priority_update( queue_context, previous_owner ); _Thread_queue_Context_add_priority_update( queue_context, previous_owner );
#if defined(RTEMS_DEBUG)
_Thread_queue_Do_nothing_priority_actions( queue, &queue_context->Priority.Actions );
#endif
} }
_Thread_Wait_release_default_critical( previous_owner, &lock_context ); _Thread_Wait_release_default_critical( previous_owner, &lock_context );