From c6362f640a084b3972f9d80e029c607a5d5f52e3 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 29 Oct 2021 13:44:04 +0200 Subject: 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. --- cpukit/include/rtems/score/schedulersmpimpl.h | 64 +++++++++++++++------------ 1 file changed, 35 insertions(+), 29 deletions(-) (limited to 'cpukit/include/rtems/score/schedulersmpimpl.h') diff --git a/cpukit/include/rtems/score/schedulersmpimpl.h b/cpukit/include/rtems/score/schedulersmpimpl.h index 8aa41e81e4..f4383e9379 100644 --- a/cpukit/include/rtems/score/schedulersmpimpl.h +++ b/cpukit/include/rtems/score/schedulersmpimpl.h @@ -1326,43 +1326,49 @@ static inline void _Scheduler_SMP_Unblock( ) { 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 ); - unblock = _Scheduler_Unblock_node( - thread, - node, - node_state == SCHEDULER_SMP_NODE_SCHEDULED, - release_idle_node, - context - ); - if ( unblock ) { - Priority_Control priority; - bool needs_help; + if ( RTEMS_PREDICT_FALSE( node_state == SCHEDULER_SMP_NODE_SCHEDULED ) ) { + _Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_SCHEDULED ); + _Scheduler_Discard_idle_thread( + thread, + node, + release_idle_node, + context + ); - priority = _Scheduler_Node_get_priority( node ); - priority = SCHEDULER_PRIORITY_PURIFY( priority ); + return; + } - if ( priority != _Scheduler_SMP_Node_priority( node ) ) { - ( *update )( context, node, priority ); - } + _Scheduler_Thread_change_state( thread, THREAD_SCHEDULER_READY ); - if ( node_state == SCHEDULER_SMP_NODE_BLOCKED ) { - Priority_Control insert_priority; + priority = _Scheduler_Node_get_priority( node ); + priority = SCHEDULER_PRIORITY_PURIFY( 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 ( priority != _Scheduler_SMP_Node_priority( node ) ) { + ( *update )( context, node, priority ); + } - if ( needs_help ) { - _Scheduler_Ask_for_help( thread ); - } + if ( node_state == SCHEDULER_SMP_NODE_BLOCKED ) { + 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 ); } } -- cgit v1.2.3