forked from Imagelibrary/rtems
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:
@@ -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
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1326,43 +1326,49 @@ 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(
|
|
||||||
thread,
|
|
||||||
node,
|
|
||||||
node_state == SCHEDULER_SMP_NODE_SCHEDULED,
|
|
||||||
release_idle_node,
|
|
||||||
context
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( unblock ) {
|
if ( RTEMS_PREDICT_FALSE( node_state == SCHEDULER_SMP_NODE_SCHEDULED ) ) {
|
||||||
Priority_Control priority;
|
_Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_SCHEDULED );
|
||||||
bool needs_help;
|
_Scheduler_Discard_idle_thread(
|
||||||
|
thread,
|
||||||
|
node,
|
||||||
|
release_idle_node,
|
||||||
|
context
|
||||||
|
);
|
||||||
|
|
||||||
priority = _Scheduler_Node_get_priority( node );
|
return;
|
||||||
priority = SCHEDULER_PRIORITY_PURIFY( priority );
|
}
|
||||||
|
|
||||||
if ( priority != _Scheduler_SMP_Node_priority( node ) ) {
|
_Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_READY );
|
||||||
( *update )( context, node, priority );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( node_state == SCHEDULER_SMP_NODE_BLOCKED ) {
|
priority = _Scheduler_Node_get_priority( node );
|
||||||
Priority_Control insert_priority;
|
priority = SCHEDULER_PRIORITY_PURIFY( priority );
|
||||||
|
|
||||||
insert_priority = SCHEDULER_PRIORITY_APPEND( priority );
|
if ( priority != _Scheduler_SMP_Node_priority( node ) ) {
|
||||||
needs_help = ( *enqueue )( context, node, insert_priority );
|
( *update )( context, node, priority );
|
||||||
} else {
|
}
|
||||||
_Assert( node_state == SCHEDULER_SMP_NODE_READY );
|
|
||||||
_Assert( node->sticky_level > 0 );
|
|
||||||
_Assert( node->idle == NULL );
|
|
||||||
needs_help = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( needs_help ) {
|
if ( node_state == SCHEDULER_SMP_NODE_BLOCKED ) {
|
||||||
_Scheduler_Ask_for_help( thread );
|
Priority_Control insert_priority;
|
||||||
}
|
|
||||||
|
insert_priority = SCHEDULER_PRIORITY_APPEND( priority );
|
||||||
|
needs_help = ( *enqueue )( context, node, insert_priority );
|
||||||
|
} else {
|
||||||
|
_Assert( node_state == SCHEDULER_SMP_NODE_READY );
|
||||||
|
_Assert( node->sticky_level > 0 );
|
||||||
|
_Assert( node->idle == NULL );
|
||||||
|
needs_help = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( needs_help ) {
|
||||||
|
_Scheduler_Ask_for_help( thread );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user