score: Move _Scheduler_Unblock_node()

Move _Scheduler_Unblock_node() into _Scheduler_SMP_Unblock().  This simplifies
the code and makes it easier to review.

Update #4531.
This commit is contained in:
Sebastian Huber
2021-10-29 13:44:04 +02:00
parent dcd8b939ba
commit c6362f640a
2 changed files with 35 additions and 71 deletions

View File

@@ -954,48 +954,6 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Discard_idle_thread(
_Thread_Set_CPU( the_thread, cpu ); _Thread_Set_CPU( the_thread, cpu );
_Thread_Dispatch_update_heir( _Per_CPU_Get(), cpu, the_thread ); _Thread_Dispatch_update_heir( _Per_CPU_Get(), cpu, the_thread );
} }
/**
* @brief Unblocks this scheduler node.
*
* @param context The scheduler instance context.
* @param[in, out] the_thread The thread which wants to get unblocked.
* @param[in, out] node The node which wants to get unblocked.
* @param is_scheduled This node is scheduled.
* @param release_idle_thread Function to release an idle thread.
*
* @retval true Continue with the unblocking operation.
* @retval false Do not continue with the unblocking operation.
*/
RTEMS_INLINE_ROUTINE bool _Scheduler_Unblock_node(
Thread_Control *the_thread,
Scheduler_Node *node,
bool is_scheduled,
Scheduler_Release_idle_node release_idle_node,
void *arg
)
{
bool unblock;
++node->sticky_level;
_Assert( node->sticky_level > 0 );
if ( is_scheduled ) {
_Scheduler_Thread_change_state( the_thread, THREAD_SCHEDULER_SCHEDULED );
_Scheduler_Discard_idle_thread(
the_thread,
node,
release_idle_node,
arg
);
unblock = false;
} else {
_Scheduler_Thread_change_state( the_thread, THREAD_SCHEDULER_READY );
unblock = true;
}
return unblock;
}
#endif #endif
/** /**

View File

@@ -1326,20 +1326,27 @@ static inline void _Scheduler_SMP_Unblock(
) )
{ {
Scheduler_SMP_Node_state node_state; Scheduler_SMP_Node_state node_state;
bool unblock; Priority_Control priority;
bool needs_help;
++node->sticky_level;
_Assert( node->sticky_level > 0 );
node_state = _Scheduler_SMP_Node_state( node ); node_state = _Scheduler_SMP_Node_state( node );
unblock = _Scheduler_Unblock_node(
if ( RTEMS_PREDICT_FALSE( node_state == SCHEDULER_SMP_NODE_SCHEDULED ) ) {
_Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_SCHEDULED );
_Scheduler_Discard_idle_thread(
thread, thread,
node, node,
node_state == SCHEDULER_SMP_NODE_SCHEDULED,
release_idle_node, release_idle_node,
context context
); );
if ( unblock ) { return;
Priority_Control priority; }
bool needs_help;
_Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_READY );
priority = _Scheduler_Node_get_priority( node ); priority = _Scheduler_Node_get_priority( node );
priority = SCHEDULER_PRIORITY_PURIFY( priority ); priority = SCHEDULER_PRIORITY_PURIFY( priority );
@@ -1363,7 +1370,6 @@ static inline void _Scheduler_SMP_Unblock(
if ( needs_help ) { if ( needs_help ) {
_Scheduler_Ask_for_help( thread ); _Scheduler_Ask_for_help( thread );
} }
}
} }
/** /**