[PATCH] score: Make SMP only code explicit

Sebastian Huber sebastian.huber at embedded-brains.de
Thu Jun 23 08:28:02 UTC 2022


Conditional expressions with inline functions are not optimized away if
optimization is disabled.  Avoid such expressions to prevent dead
branches.  It helps also during code review to immediately see if a loop
is used or not.
---
 cpukit/include/rtems/score/priorityimpl.h | 33 ++++-------------------
 cpukit/score/src/kern_tc.c                |  4 +++
 cpukit/score/src/threadchangepriority.c   | 10 ++++++-
 cpukit/score/src/threadqops.c             | 16 +++++++++--
 cpukit/score/src/watchdogtick.c           |  4 +++
 5 files changed, 36 insertions(+), 31 deletions(-)

diff --git a/cpukit/include/rtems/score/priorityimpl.h b/cpukit/include/rtems/score/priorityimpl.h
index 1463bf6c2a..55cddf53be 100644
--- a/cpukit/include/rtems/score/priorityimpl.h
+++ b/cpukit/include/rtems/score/priorityimpl.h
@@ -124,26 +124,6 @@ RTEMS_INLINE_ROUTINE bool _Priority_Actions_is_empty(
   return actions->actions == NULL;
 }
 
-/**
- * @brief Checks if the priority actions is valid.
- *
- * @param aggregation The aggregation of the priority action.
- *
- * @retval true The @a aggregation is valid.
- * @retval false The @a aggregation is not valid.
- */
-RTEMS_INLINE_ROUTINE bool _Priority_Actions_is_valid(
-  const Priority_Aggregation *aggregation
-)
-{
-#if defined(RTEMS_SMP)
-  return aggregation != NULL;
-#else
-  (void) aggregation;
-  return false;
-#endif
-}
-
 /**
  * @brief Moves the priority actions' actions.
  *
@@ -389,25 +369,22 @@ RTEMS_INLINE_ROUTINE void _Priority_Set_action(
   aggregation->Action.type = type;
 }
 
+#if defined(RTEMS_SMP)
 /**
  * @brief Gets the next action of the priority aggregation.
  *
- * @param aggregation The priority aggregation to get the next action of.
+ * @param aggregation is the priority aggregation to get the next action of.
  *
- * @retval next_action The next action of @a aggregation if RTEMS_SMP is defined.
- * @retval NULL RTEMS_SMP is not defined.
+ * @return Returns the next action of the priority aggregation or NULL if there
+ *   is no next action.
  */
 RTEMS_INLINE_ROUTINE Priority_Aggregation *_Priority_Get_next_action(
   const Priority_Aggregation *aggregation
 )
 {
-#if defined(RTEMS_SMP)
   return aggregation->Action.next;
-#else
-  (void) aggregation;
-  return NULL;
-#endif
 }
+#endif
 
 /**
  * @brief Compares two priorities.
diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c
index 2b7aeaad31..643026a1c8 100644
--- a/cpukit/score/src/kern_tc.c
+++ b/cpukit/score/src/kern_tc.c
@@ -2329,9 +2329,13 @@ _Timecounter_Tick(void)
 {
 	Per_CPU_Control *cpu_self = _Per_CPU_Get();
 
+#if defined(RTEMS_SMP)
 	if (_Per_CPU_Is_boot_processor(cpu_self)) {
+#endif
                 tc_windup(NULL);
+#if defined(RTEMS_SMP)
 	}
+#endif
 
 	_Watchdog_Tick(cpu_self);
 }
diff --git a/cpukit/score/src/threadchangepriority.c b/cpukit/score/src/threadchangepriority.c
index 321bb15cab..80f030fdc6 100644
--- a/cpukit/score/src/threadchangepriority.c
+++ b/cpukit/score/src/threadchangepriority.c
@@ -135,11 +135,15 @@ static void _Thread_Priority_do_perform_actions(
   priority_aggregation = _Priority_Actions_move( &queue_context->Priority.Actions );
 
   do {
+#if defined(RTEMS_SMP)
     Priority_Aggregation *next_aggregation;
+#endif
     Priority_Node        *priority_action_node;
     Priority_Action_type  priority_action_type;
 
+#if defined(RTEMS_SMP)
     next_aggregation = _Priority_Get_next_action( priority_aggregation );
+#endif
 
     priority_action_node = priority_aggregation->Action.node;
     priority_action_type = priority_aggregation->Action.type;
@@ -198,8 +202,12 @@ static void _Thread_Priority_do_perform_actions(
         break;
     }
 
+#if defined(RTEMS_SMP)
     priority_aggregation = next_aggregation;
-  } while ( _Priority_Actions_is_valid( priority_aggregation ) );
+  } while ( priority_aggregation != NULL );
+#else
+  } while ( false );
+#endif
 
   if ( !_Priority_Actions_is_empty( &queue_context->Priority.Actions ) ) {
     _Thread_queue_Context_add_priority_update( queue_context, the_thread );
diff --git a/cpukit/score/src/threadqops.c b/cpukit/score/src/threadqops.c
index 33fc5a44cb..fbea9f6de6 100644
--- a/cpukit/score/src/threadqops.c
+++ b/cpukit/score/src/threadqops.c
@@ -404,8 +404,12 @@ static void _Thread_queue_Priority_priority_actions(
         break;
     }
 
+#if defined(RTEMS_SMP)
     priority_aggregation = _Priority_Get_next_action( priority_aggregation );
-  } while ( _Priority_Actions_is_valid( priority_aggregation ) );
+  } while ( priority_aggregation != NULL );
+#else
+  } while ( false );
+#endif
 }
 
 static void _Thread_queue_Priority_do_initialize(
@@ -734,14 +738,18 @@ static void _Thread_queue_Priority_inherit_priority_actions(
   priority_aggregation = _Priority_Actions_move( priority_actions );
 
   do {
+#if defined(RTEMS_SMP)
     Priority_Aggregation        *next_aggregation;
+#endif
     Scheduler_Node              *scheduler_node;
     size_t                       scheduler_index;
     Thread_queue_Priority_queue *priority_queue;
     Scheduler_Node              *scheduler_node_of_owner;
     Priority_Action_type         priority_action_type;
 
+#if defined(RTEMS_SMP)
     next_aggregation = _Priority_Get_next_action( priority_aggregation );
+#endif
 
     scheduler_node = SCHEDULER_NODE_OF_WAIT_PRIORITY( priority_aggregation );
     scheduler_index = _Thread_queue_Scheduler_index( scheduler_node );
@@ -797,8 +805,12 @@ static void _Thread_queue_Priority_inherit_priority_actions(
         break;
     }
 
+#if defined(RTEMS_SMP)
     priority_aggregation = next_aggregation;
-  } while ( _Priority_Actions_is_valid( priority_aggregation ) );
+  } while ( priority_aggregation != NULL );
+#else
+  } while ( false );
+#endif
 }
 
 static void _Thread_queue_Priority_inherit_do_initialize(
diff --git a/cpukit/score/src/watchdogtick.c b/cpukit/score/src/watchdogtick.c
index 6edb3f071a..71311b598e 100644
--- a/cpukit/score/src/watchdogtick.c
+++ b/cpukit/score/src/watchdogtick.c
@@ -83,9 +83,13 @@ void _Watchdog_Tick( Per_CPU_Control *cpu )
   Thread_Control                     *executing;
   const Thread_CPU_budget_operations *cpu_budget_operations;
 
+#ifdef RTEMS_SMP
   if ( _Per_CPU_Is_boot_processor( cpu ) ) {
+#endif
     ++_Watchdog_Ticks_since_boot;
+#ifdef RTEMS_SMP
   }
+#endif
 
   _ISR_lock_ISR_disable_and_acquire( &cpu->Watchdog.Lock, &lock_context );
 
-- 
2.35.3



More information about the devel mailing list