[PATCH 21/27] score: Move _Scheduler_Unblock_node()

Sebastian Huber sebastian.huber at embedded-brains.de
Mon Nov 15 17:12:53 UTC 2021


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 );
   }
 }
 
-- 
2.26.2



More information about the devel mailing list