[PATCH 1/6] score: Remove scheduler parameter from most ops

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Jun 13 14:37:18 UTC 2014


Remove the scheduler parameter from most high level scheduler operations
like
  - _Scheduler_Block(),
  - _Scheduler_Unblock(),
  - _Scheduler_Change_priority(),
  - _Scheduler_Update_priority(),
  - _Scheduler_Release_job(), and
  - _Scheduler_Yield().

This simplifies the scheduler operations usage.
---
 cpukit/rtems/src/ratemoncancel.c                 |    6 +-
 cpukit/rtems/src/ratemondelete.c                 |    6 +-
 cpukit/rtems/src/ratemonperiod.c                 |   12 +---
 cpukit/score/include/rtems/score/schedulerimpl.h |   93 +++++++++++-----------
 cpukit/score/src/schedulerdefaultstartidle.c     |    3 +-
 cpukit/score/src/threadchangepriority.c          |   10 +--
 cpukit/score/src/threadclearstate.c              |    2 +-
 cpukit/score/src/threadready.c                   |    2 +-
 cpukit/score/src/threadsetpriority.c             |    6 +-
 cpukit/score/src/threadsetstate.c                |    2 +-
 cpukit/score/src/threadyield.c                   |    2 +-
 11 files changed, 60 insertions(+), 84 deletions(-)

diff --git a/cpukit/rtems/src/ratemoncancel.c b/cpukit/rtems/src/ratemoncancel.c
index 9f993f2..d4a9102 100644
--- a/cpukit/rtems/src/ratemoncancel.c
+++ b/cpukit/rtems/src/ratemoncancel.c
@@ -40,11 +40,7 @@ rtems_status_code rtems_rate_monotonic_cancel(
       }
       (void) _Watchdog_Remove( &the_period->Timer );
       the_period->state = RATE_MONOTONIC_INACTIVE;
-      _Scheduler_Release_job(
-        _Scheduler_Get( the_period->owner ),
-        the_period->owner,
-        0
-      );
+      _Scheduler_Release_job( the_period->owner, 0 );
       _Objects_Put( &the_period->Object );
       return RTEMS_SUCCESSFUL;
 
diff --git a/cpukit/rtems/src/ratemondelete.c b/cpukit/rtems/src/ratemondelete.c
index ee0b236..971ad8e 100644
--- a/cpukit/rtems/src/ratemondelete.c
+++ b/cpukit/rtems/src/ratemondelete.c
@@ -35,11 +35,7 @@ rtems_status_code rtems_rate_monotonic_delete(
   switch ( location ) {
 
     case OBJECTS_LOCAL:
-      _Scheduler_Release_job(
-        _Scheduler_Get( the_period->owner ),
-        the_period->owner,
-        0
-      );
+      _Scheduler_Release_job( the_period->owner, 0 );
       _Objects_Close( &_Rate_monotonic_Information, &the_period->Object );
       (void) _Watchdog_Remove( &the_period->Timer );
       the_period->state = RATE_MONOTONIC_INACTIVE;
diff --git a/cpukit/rtems/src/ratemonperiod.c b/cpukit/rtems/src/ratemonperiod.c
index 9d31813..ca278fb 100644
--- a/cpukit/rtems/src/ratemonperiod.c
+++ b/cpukit/rtems/src/ratemonperiod.c
@@ -144,11 +144,7 @@ void _Rate_monotonic_Initiate_statistics(
     }
   #endif
 
-  _Scheduler_Release_job(
-    _Scheduler_Get( the_period->owner ),
-    the_period->owner,
-    the_period->next_length
-  );
+  _Scheduler_Release_job( the_period->owner, the_period->next_length );
 }
 
 static void _Rate_monotonic_Update_statistics(
@@ -344,11 +340,7 @@ rtems_status_code rtems_rate_monotonic_period(
         the_period->next_length = length;
 
         _Watchdog_Insert_ticks( &the_period->Timer, length );
-        _Scheduler_Release_job(
-          _Scheduler_Get( the_period->owner ),
-          the_period->owner,
-          the_period->next_length
-        );
+        _Scheduler_Release_job( the_period->owner, the_period->next_length );
         _Objects_Put( &the_period->Object );
         return RTEMS_TIMEOUT;
       }
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index f162ab3..ad4c799 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -42,6 +42,19 @@ extern "C" {
  */
 void _Scheduler_Handler_initialization( void );
 
+RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get(
+  const Thread_Control *the_thread
+)
+{
+#if defined(RTEMS_SMP)
+  return the_thread->scheduler;
+#else
+  (void) the_thread;
+
+  return &_Scheduler_Table[ 0 ];
+#endif
+}
+
 RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get_by_CPU_index(
   uint32_t cpu_index
 )
@@ -80,18 +93,17 @@ RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get_by_CPU(
  */
 
 /**
- * @brief Scheduler schedule.
+ * @brief General scheduling decision.
  *
  * This kernel routine implements the scheduling decision logic for
  * the scheduler. It does NOT dispatch.
  *
  * @param[in] the_thread The thread which state changed previously.
  */
-RTEMS_INLINE_ROUTINE void _Scheduler_Schedule(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *the_thread
-)
+RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( Thread_Control *the_thread )
 {
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
+
   ( *scheduler->Operations.schedule )( scheduler, the_thread );
 }
 
@@ -103,43 +115,44 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Schedule(
  *
  * @param[in] the_thread The yielding thread.
  */
-RTEMS_INLINE_ROUTINE void _Scheduler_Yield(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *the_thread
-)
+RTEMS_INLINE_ROUTINE void _Scheduler_Yield( Thread_Control *the_thread )
 {
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
+
   ( *scheduler->Operations.yield )( scheduler, the_thread );
 }
 
 /**
- * @brief Scheduler block.
+ * @brief Blocks a thread with respect to the scheduler.
  *
  * This routine removes @a the_thread from the scheduling decision for
  * the scheduler. The primary task is to remove the thread from the
  * ready queue.  It performs any necessary schedulering operations
  * including the selection of a new heir thread.
+ *
+ * @param[in] the_thread The thread.
  */
-RTEMS_INLINE_ROUTINE void _Scheduler_Block(
-  const Scheduler_Control *scheduler,
-  Thread_Control               *the_thread
-)
+RTEMS_INLINE_ROUTINE void _Scheduler_Block( Thread_Control *the_thread )
 {
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
+
   ( *scheduler->Operations.block )( scheduler, the_thread );
 }
 
 /**
- * @brief Scheduler unblock.
+ * @brief Unblocks a thread with respect to the scheduler.
  *
  * This routine adds @a the_thread to the scheduling decision for
  * the scheduler.  The primary task is to add the thread to the
  * ready queue per the schedulering policy and update any appropriate
  * scheduling variables, for example the heir thread.
+ *
+ * @param[in] the_thread The thread.
  */
-RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *the_thread
-)
+RTEMS_INLINE_ROUTINE void _Scheduler_Unblock( Thread_Control *the_thread )
 {
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
+
   ( *scheduler->Operations.unblock )( scheduler, the_thread );
 }
 
@@ -150,7 +163,6 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
  * must ensure that the priority value actually changed and is not equal to the
  * current priority value.
  *
- * @param[in] scheduler The scheduler instance.
  * @param[in] the_thread The thread changing its priority.
  * @param[in] new_priority The new thread priority.
  * @param[in] prepend_it In case this is true, then enqueue the thread as the
@@ -158,12 +170,13 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Unblock(
  * priority group.
  */
 RTEMS_INLINE_ROUTINE void _Scheduler_Change_priority(
-  const Scheduler_Control *scheduler,
   Thread_Control          *the_thread,
   Priority_Control         new_priority,
   bool                     prepend_it
 )
 {
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
+
   ( *scheduler->Operations.change_priority )(
     scheduler,
     the_thread,
@@ -215,11 +228,12 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Node_destroy(
  * @param[in] new_priority The new priority of the thread.
  */
 RTEMS_INLINE_ROUTINE void _Scheduler_Update_priority(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *the_thread,
-  Priority_Control         new_priority
+  Thread_Control   *the_thread,
+  Priority_Control  new_priority
 )
 {
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
+
   ( *scheduler->Operations.update_priority )(
     scheduler,
     the_thread,
@@ -253,16 +267,18 @@ RTEMS_INLINE_ROUTINE int _Scheduler_Priority_compare(
 }
 
 /**
- * @brief Scheduler release job.
+ * @brief Releases a job of a thread with respect to the scheduler.
  *
- * This routine is called when a new period of task is issued.
+ * @param[in] the_thread The thread.
+ * @param[in] length The period length.
  */
 RTEMS_INLINE_ROUTINE void _Scheduler_Release_job(
-  const Scheduler_Control *scheduler,
-  Thread_Control          *the_thread,
-  uint32_t                 length
+  Thread_Control *the_thread,
+  uint32_t        length
 )
 {
+  const Scheduler_Control *scheduler = _Scheduler_Get( the_thread );
+
   ( *scheduler->Operations.release_job )( scheduler, the_thread, length );
 }
 
@@ -348,19 +364,6 @@ RTEMS_INLINE_ROUTINE bool _Scheduler_Has_processor_ownership(
 #endif
 }
 
-RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get(
-  const Thread_Control *the_thread
-)
-{
-#if defined(RTEMS_SMP)
-  return the_thread->scheduler;
-#else
-  (void) the_thread;
-
-  return &_Scheduler_Table[ 0 ];
-#endif
-}
-
 RTEMS_INLINE_ROUTINE void _Scheduler_Set(
   const Scheduler_Control *scheduler,
   Thread_Control          *the_thread
@@ -374,11 +377,7 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Set(
     _Scheduler_Node_destroy( current_scheduler, the_thread );
     the_thread->scheduler = scheduler;
     _Scheduler_Node_initialize( scheduler, the_thread );
-    _Scheduler_Update_priority(
-      scheduler,
-      the_thread,
-      the_thread->current_priority
-    );
+    _Scheduler_Update_priority( the_thread, the_thread->current_priority );
     _Thread_Clear_state( the_thread, STATES_MIGRATING );
   }
 #else
diff --git a/cpukit/score/src/schedulerdefaultstartidle.c b/cpukit/score/src/schedulerdefaultstartidle.c
index eeed928..2da7f8d 100644
--- a/cpukit/score/src/schedulerdefaultstartidle.c
+++ b/cpukit/score/src/schedulerdefaultstartidle.c
@@ -18,6 +18,7 @@ void _Scheduler_default_Start_idle(
   Per_CPU_Control         *cpu
 )
 {
+  (void) scheduler;
   (void) cpu;
-  _Scheduler_Unblock( scheduler, the_thread );
+  _Scheduler_Unblock( the_thread );
 }
diff --git a/cpukit/score/src/threadchangepriority.c b/cpukit/score/src/threadchangepriority.c
index c2e48e1..8ddaa0b 100644
--- a/cpukit/score/src/threadchangepriority.c
+++ b/cpukit/score/src/threadchangepriority.c
@@ -81,17 +81,14 @@ void _Thread_Change_priority(
    *  we are not REALLY changing priority.
    */
   if ( the_thread->current_priority != new_priority ) {
-    ISR_Level                level;
-    const Scheduler_Control *scheduler;
+    ISR_Level level;
 
     _ISR_Disable( level );
 
-    scheduler = _Scheduler_Get( the_thread );
     the_thread->current_priority = new_priority;
 
     if ( _States_Is_ready( the_thread->current_state ) ) {
       _Scheduler_Change_priority(
-        scheduler,
         the_thread,
         new_priority,
         prepend_it
@@ -103,10 +100,9 @@ void _Thread_Change_priority(
        *  We altered the set of thread priorities.  So let's figure out
        *  who is the heir and if we need to switch to them.
        */
-      scheduler = _Scheduler_Get( the_thread );
-      _Scheduler_Schedule( scheduler, the_thread );
+      _Scheduler_Schedule( the_thread );
     } else {
-      _Scheduler_Update_priority( scheduler, the_thread, new_priority );
+      _Scheduler_Update_priority( the_thread, new_priority );
     }
     _ISR_Enable( level );
 
diff --git a/cpukit/score/src/threadclearstate.c b/cpukit/score/src/threadclearstate.c
index 10bdae6..19e41df 100644
--- a/cpukit/score/src/threadclearstate.c
+++ b/cpukit/score/src/threadclearstate.c
@@ -37,7 +37,7 @@ void _Thread_Clear_state(
       the_thread->current_state = _States_Clear( state, current_state );
 
       if ( _States_Is_ready( current_state ) ) {
-        _Scheduler_Unblock( _Scheduler_Get( the_thread ), the_thread );
+        _Scheduler_Unblock( the_thread );
       }
   }
   _ISR_Enable( level );
diff --git a/cpukit/score/src/threadready.c b/cpukit/score/src/threadready.c
index d50debe..b79d8db 100644
--- a/cpukit/score/src/threadready.c
+++ b/cpukit/score/src/threadready.c
@@ -32,7 +32,7 @@ void _Thread_Ready(
 
   the_thread->current_state = STATES_READY;
 
-  _Scheduler_Unblock( _Scheduler_Get( the_thread ), the_thread );
+  _Scheduler_Unblock( the_thread );
 
   _ISR_Enable( level );
 }
diff --git a/cpukit/score/src/threadsetpriority.c b/cpukit/score/src/threadsetpriority.c
index 455cf20..e1ff118 100644
--- a/cpukit/score/src/threadsetpriority.c
+++ b/cpukit/score/src/threadsetpriority.c
@@ -28,9 +28,5 @@ void _Thread_Set_priority(
 {
   the_thread->current_priority = new_priority;
 
-  _Scheduler_Update_priority(
-    _Scheduler_Get( the_thread),
-    the_thread,
-    new_priority
-  );
+  _Scheduler_Update_priority( the_thread, new_priority );
 }
diff --git a/cpukit/score/src/threadsetstate.c b/cpukit/score/src/threadsetstate.c
index 97da2bf..a8cd38e 100644
--- a/cpukit/score/src/threadsetstate.c
+++ b/cpukit/score/src/threadsetstate.c
@@ -39,7 +39,7 @@ void _Thread_Set_state(
   if ( _States_Is_ready( current_state ) ) {
     the_thread->current_state = state;
 
-    _Scheduler_Block( _Scheduler_Get( the_thread ), the_thread );
+    _Scheduler_Block( the_thread );
   } else {
     the_thread->current_state = _States_Set( state, current_state);
   }
diff --git a/cpukit/score/src/threadyield.c b/cpukit/score/src/threadyield.c
index b49e2b3..fc796da 100644
--- a/cpukit/score/src/threadyield.c
+++ b/cpukit/score/src/threadyield.c
@@ -34,7 +34,7 @@ void _Thread_Yield( Thread_Control *executing )
   _ISR_Disable( level );
 
   if ( _States_Is_ready( executing->current_state ) ) {
-    _Scheduler_Yield( _Scheduler_Get( executing ), executing );
+    _Scheduler_Yield( executing );
   }
 
   _ISR_Enable( level );
-- 
1.7.7




More information about the devel mailing list