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/schedulerimpl.h | 42 ------------------ cpukit/include/rtems/score/schedulersmpimpl.h | 64 +++++++++++++++------------ 2 files changed, 35 insertions(+), 71 deletions(-) diff --git a/cpukit/include/rtems/score/schedulerimpl.h b/cpukit/include/rtems/score/schedulerimpl.h index 0081b1904b..10dd039086 100644 --- a/cpukit/include/rtems/score/schedulerimpl.h +++ b/cpukit/include/rtems/score/schedulerimpl.h @@ -954,48 +954,6 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Discard_idle_thread( _Thread_Set_CPU( the_thread, cpu ); _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 /** 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