From 3730a07fac4c66e9f01c4c620fec33b93a3aff3b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 13 May 2014 15:08:07 +0200 Subject: score: Use Scheduler_Context for SMP scheduler Use the basic Scheduler_Context for the general SMP scheduler operations to avoid usage of structure offsets to get the specialized context variants. --- .../score/include/rtems/score/schedulersmpimpl.h | 67 +++++++++++++--------- cpukit/score/src/schedulerprioritysmp.c | 46 +++++++-------- cpukit/score/src/schedulersimplesmp.c | 48 ++++++++-------- 3 files changed, 88 insertions(+), 73 deletions(-) diff --git a/cpukit/score/include/rtems/score/schedulersmpimpl.h b/cpukit/score/include/rtems/score/schedulersmpimpl.h index 5355ea4dcb..161f742d18 100644 --- a/cpukit/score/include/rtems/score/schedulersmpimpl.h +++ b/cpukit/score/include/rtems/score/schedulersmpimpl.h @@ -314,24 +314,31 @@ extern "C" { */ typedef Thread_Control *( *Scheduler_SMP_Get_highest_ready )( - Scheduler_SMP_Context *self + Scheduler_Context *context ); typedef void ( *Scheduler_SMP_Extract )( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread ); typedef void ( *Scheduler_SMP_Insert )( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread_to_insert ); typedef void ( *Scheduler_SMP_Move )( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread_to_move ); +static inline Scheduler_SMP_Context *_Scheduler_SMP_Get_self( + Scheduler_Context *context +) +{ + return (Scheduler_SMP_Context *) context; +} + static inline void _Scheduler_SMP_Initialize( Scheduler_SMP_Context *self ) @@ -472,7 +479,7 @@ static inline Thread_Control *_Scheduler_SMP_Get_lowest_scheduled( * of scheduled nodes to the set of ready nodes. */ static inline void _Scheduler_SMP_Enqueue_ordered( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread, Chain_Node_order order, Scheduler_SMP_Get_highest_ready get_highest_ready, @@ -482,10 +489,11 @@ static inline void _Scheduler_SMP_Enqueue_ordered( Scheduler_SMP_Move move_from_scheduled_to_ready ) { + Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context ); Scheduler_SMP_Node *node = _Scheduler_SMP_Node_get( thread ); if ( node->state == SCHEDULER_SMP_NODE_IN_THE_AIR ) { - Thread_Control *highest_ready = ( *get_highest_ready )( self ); + Thread_Control *highest_ready = ( *get_highest_ready )( &self->Base ); /* * The thread has been extracted from the scheduled chain. We have to @@ -499,14 +507,15 @@ static inline void _Scheduler_SMP_Enqueue_ordered( ) { _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_READY ); _Scheduler_SMP_Allocate_processor( self, highest_ready, thread ); - ( *insert_ready )( self, thread ); - ( *move_from_ready_to_scheduled )( self, highest_ready ); + ( *insert_ready )( &self->Base, thread ); + ( *move_from_ready_to_scheduled )( &self->Base, highest_ready ); } else { _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_SCHEDULED ); - ( *insert_scheduled )( self, thread ); + ( *insert_scheduled )( &self->Base, thread ); } } else { - Thread_Control *lowest_scheduled = _Scheduler_SMP_Get_lowest_scheduled( self ); + Thread_Control *lowest_scheduled = + _Scheduler_SMP_Get_lowest_scheduled( self ); /* * The scheduled chain is empty if nested interrupts change the priority of @@ -524,27 +533,28 @@ static inline void _Scheduler_SMP_Enqueue_ordered( SCHEDULER_SMP_NODE_READY ); _Scheduler_SMP_Allocate_processor( self, thread, lowest_scheduled ); - ( *insert_scheduled )( self, thread ); - ( *move_from_scheduled_to_ready )( self, lowest_scheduled ); + ( *insert_scheduled )( &self->Base, thread ); + ( *move_from_scheduled_to_ready )( &self->Base, lowest_scheduled ); } else { _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_READY ); - ( *insert_ready )( self, thread ); + ( *insert_ready )( &self->Base, thread ); } } } static inline void _Scheduler_SMP_Schedule_highest_ready( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *victim, Scheduler_SMP_Get_highest_ready get_highest_ready, Scheduler_SMP_Move move_from_ready_to_scheduled ) { - Thread_Control *highest_ready = ( *get_highest_ready )( self ); + Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context ); + Thread_Control *highest_ready = ( *get_highest_ready )( &self->Base ); _Scheduler_SMP_Allocate_processor( self, highest_ready, victim ); - ( *move_from_ready_to_scheduled )( self, highest_ready ); + ( *move_from_ready_to_scheduled )( &self->Base, highest_ready ); } /** @@ -557,7 +567,7 @@ static inline void _Scheduler_SMP_Schedule_highest_ready( * of ready nodes to the set of scheduled nodes. */ static inline void _Scheduler_SMP_Schedule( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread, Scheduler_SMP_Get_highest_ready get_highest_ready, Scheduler_SMP_Move move_from_ready_to_scheduled @@ -569,7 +579,7 @@ static inline void _Scheduler_SMP_Schedule( _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_BLOCKED ); _Scheduler_SMP_Schedule_highest_ready( - self, + context, thread, get_highest_ready, move_from_ready_to_scheduled @@ -578,17 +588,17 @@ static inline void _Scheduler_SMP_Schedule( } static inline void _Scheduler_SMP_Block( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread, Scheduler_SMP_Extract extract, Scheduler_SMP_Get_highest_ready get_highest_ready, Scheduler_SMP_Move move_from_ready_to_scheduled ) { - ( *extract )( self, thread ); + ( *extract )( context, thread ); _Scheduler_SMP_Schedule( - self, + context, thread, get_highest_ready, move_from_ready_to_scheduled @@ -604,19 +614,21 @@ static inline void _Scheduler_SMP_Block( * ready nodes. */ static inline void _Scheduler_SMP_Extract( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread, Scheduler_SMP_Extract extract ) { - ( *extract )( self, thread ); + ( *extract )( context, thread ); } static inline void _Scheduler_SMP_Insert_scheduled_lifo( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread ) { + Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context ); + _Chain_Insert_ordered_unprotected( &self->Scheduled, &thread->Object.Node, @@ -625,10 +637,12 @@ static inline void _Scheduler_SMP_Insert_scheduled_lifo( } static inline void _Scheduler_SMP_Insert_scheduled_fifo( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread ) { + Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context ); + _Chain_Insert_ordered_unprotected( &self->Scheduled, &thread->Object.Node, @@ -637,11 +651,12 @@ static inline void _Scheduler_SMP_Insert_scheduled_fifo( } static inline void _Scheduler_SMP_Start_idle( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread, Per_CPU_Control *cpu ) { + Scheduler_SMP_Context *self = _Scheduler_SMP_Get_self( context ); Scheduler_SMP_Node *node = _Scheduler_SMP_Node_get( thread ); node->state = SCHEDULER_SMP_NODE_SCHEDULED; diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c index 263bc8746d..98ff454564 100644 --- a/cpukit/score/src/schedulerprioritysmp.c +++ b/cpukit/score/src/schedulerprioritysmp.c @@ -36,11 +36,9 @@ _Scheduler_priority_SMP_Get_context( const Scheduler_Control *scheduler ) } static Scheduler_priority_SMP_Context * -_Scheduler_priority_SMP_Self_from_SMP_base( Scheduler_SMP_Context *smp_base ) +_Scheduler_priority_SMP_Get_self( Scheduler_Context *context ) { - return (Scheduler_priority_SMP_Context *) - ( (char *) smp_base - - offsetof( Scheduler_priority_SMP_Context, Base ) ); + return (Scheduler_priority_SMP_Context *) context; } static Scheduler_priority_SMP_Node *_Scheduler_priority_SMP_Node_get( @@ -91,11 +89,11 @@ void _Scheduler_priority_SMP_Update( } static Thread_Control *_Scheduler_priority_SMP_Get_highest_ready( - Scheduler_SMP_Context *smp_base + Scheduler_Context *context ) { Scheduler_priority_SMP_Context *self = - _Scheduler_priority_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_priority_SMP_Get_self( context ); Thread_Control *highest_ready = NULL; if ( !_Priority_bit_map_Is_empty( &self->Bit_map ) ) { @@ -109,12 +107,12 @@ static Thread_Control *_Scheduler_priority_SMP_Get_highest_ready( } static void _Scheduler_priority_SMP_Move_from_scheduled_to_ready( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *scheduled_to_ready ) { Scheduler_priority_SMP_Context *self = - _Scheduler_priority_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_priority_SMP_Get_self( context ); Scheduler_priority_SMP_Node *node = _Scheduler_priority_SMP_Node_get( scheduled_to_ready ); @@ -127,12 +125,12 @@ static void _Scheduler_priority_SMP_Move_from_scheduled_to_ready( } static void _Scheduler_priority_SMP_Move_from_ready_to_scheduled( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *ready_to_scheduled ) { Scheduler_priority_SMP_Context *self = - _Scheduler_priority_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_priority_SMP_Get_self( context ); Scheduler_priority_SMP_Node *node = _Scheduler_priority_SMP_Node_get( ready_to_scheduled ); @@ -148,12 +146,12 @@ static void _Scheduler_priority_SMP_Move_from_ready_to_scheduled( } static void _Scheduler_priority_SMP_Insert_ready_lifo( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *thread ) { Scheduler_priority_SMP_Context *self = - _Scheduler_priority_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_priority_SMP_Get_self( context ); Scheduler_priority_SMP_Node *node = _Scheduler_priority_SMP_Node_get( thread ); @@ -165,12 +163,12 @@ static void _Scheduler_priority_SMP_Insert_ready_lifo( } static void _Scheduler_priority_SMP_Insert_ready_fifo( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *thread ) { Scheduler_priority_SMP_Context *self = - _Scheduler_priority_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_priority_SMP_Get_self( context ); Scheduler_priority_SMP_Node *node = _Scheduler_priority_SMP_Node_get( thread ); @@ -182,12 +180,12 @@ static void _Scheduler_priority_SMP_Insert_ready_fifo( } static void _Scheduler_priority_SMP_Do_extract( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *thread ) { Scheduler_priority_SMP_Context *self = - _Scheduler_priority_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_priority_SMP_Get_self( context ); Scheduler_priority_SMP_Node *node = _Scheduler_priority_SMP_Node_get( thread ); @@ -219,7 +217,7 @@ void _Scheduler_priority_SMP_Block( _Scheduler_priority_SMP_Get_context( scheduler ); _Scheduler_SMP_Block( - &self->Base, + &self->Base.Base, thread, _Scheduler_priority_SMP_Do_extract, _Scheduler_priority_SMP_Get_highest_ready, @@ -228,7 +226,7 @@ void _Scheduler_priority_SMP_Block( } static void _Scheduler_priority_SMP_Enqueue_ordered( - Scheduler_SMP_Context *self, + Scheduler_Context *context, Thread_Control *thread, Chain_Node_order order, Scheduler_SMP_Insert insert_ready, @@ -236,7 +234,7 @@ static void _Scheduler_priority_SMP_Enqueue_ordered( ) { _Scheduler_SMP_Enqueue_ordered( - self, + context, thread, order, _Scheduler_priority_SMP_Get_highest_ready, @@ -256,7 +254,7 @@ void _Scheduler_priority_SMP_Enqueue_lifo( _Scheduler_priority_SMP_Get_context( scheduler ); _Scheduler_priority_SMP_Enqueue_ordered( - &self->Base, + &self->Base.Base, thread, _Scheduler_simple_Insert_priority_lifo_order, _Scheduler_priority_SMP_Insert_ready_lifo, @@ -273,7 +271,7 @@ void _Scheduler_priority_SMP_Enqueue_fifo( _Scheduler_priority_SMP_Get_context( scheduler ); _Scheduler_priority_SMP_Enqueue_ordered( - &self->Base, + &self->Base.Base, thread, _Scheduler_simple_Insert_priority_fifo_order, _Scheduler_priority_SMP_Insert_ready_fifo, @@ -290,7 +288,7 @@ void _Scheduler_priority_SMP_Extract( _Scheduler_priority_SMP_Get_context( scheduler ); _Scheduler_SMP_Extract( - &self->Base, + &self->Base.Base, thread, _Scheduler_priority_SMP_Do_extract ); @@ -320,7 +318,7 @@ void _Scheduler_priority_SMP_Schedule( _Scheduler_priority_SMP_Get_context( scheduler ); _Scheduler_SMP_Schedule( - &self->Base, + &self->Base.Base, thread, _Scheduler_priority_SMP_Get_highest_ready, _Scheduler_priority_SMP_Move_from_ready_to_scheduled @@ -336,5 +334,5 @@ void _Scheduler_priority_SMP_Start_idle( Scheduler_priority_SMP_Context *self = _Scheduler_priority_SMP_Get_context( scheduler ); - _Scheduler_SMP_Start_idle( &self->Base, thread, cpu ); + _Scheduler_SMP_Start_idle( &self->Base.Base, thread, cpu ); } diff --git a/cpukit/score/src/schedulersimplesmp.c b/cpukit/score/src/schedulersimplesmp.c index 70cbc30bee..9861cb877d 100644 --- a/cpukit/score/src/schedulersimplesmp.c +++ b/cpukit/score/src/schedulersimplesmp.c @@ -29,10 +29,9 @@ _Scheduler_simple_SMP_Get_context( const Scheduler_Control *scheduler ) } static Scheduler_simple_SMP_Context * -_Scheduler_simple_SMP_Self_from_SMP_base( Scheduler_SMP_Context *smp_base ) +_Scheduler_simple_SMP_Get_self( Scheduler_Context *context ) { - return (Scheduler_simple_SMP_Context *) - ( (char *) smp_base - offsetof( Scheduler_simple_SMP_Context, Base ) ); + return (Scheduler_simple_SMP_Context *) context; } void _Scheduler_simple_SMP_Initialize( const Scheduler_Control *scheduler ) @@ -57,11 +56,11 @@ bool _Scheduler_simple_SMP_Allocate( } static Thread_Control *_Scheduler_simple_SMP_Get_highest_ready( - Scheduler_SMP_Context *smp_base + Scheduler_Context *context ) { Scheduler_simple_SMP_Context *self = - _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_simple_SMP_Get_self( context ); Thread_Control *highest_ready = NULL; Chain_Control *ready = &self->Ready; @@ -73,12 +72,12 @@ static Thread_Control *_Scheduler_simple_SMP_Get_highest_ready( } static void _Scheduler_simple_SMP_Move_from_scheduled_to_ready( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *scheduled_to_ready ) { Scheduler_simple_SMP_Context *self = - _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_simple_SMP_Get_self( context ); _Chain_Extract_unprotected( &scheduled_to_ready->Object.Node ); _Scheduler_simple_Insert_priority_lifo( @@ -88,24 +87,27 @@ static void _Scheduler_simple_SMP_Move_from_scheduled_to_ready( } static void _Scheduler_simple_SMP_Move_from_ready_to_scheduled( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *ready_to_scheduled ) { + Scheduler_simple_SMP_Context *self = + _Scheduler_simple_SMP_Get_self( context ); + _Chain_Extract_unprotected( &ready_to_scheduled->Object.Node ); _Scheduler_simple_Insert_priority_fifo( - &smp_base->Scheduled, + &self->Base.Scheduled, ready_to_scheduled ); } static void _Scheduler_simple_SMP_Insert_ready_lifo( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *thread ) { Scheduler_simple_SMP_Context *self = - _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_simple_SMP_Get_self( context ); _Chain_Insert_ordered_unprotected( &self->Ready, @@ -115,12 +117,12 @@ static void _Scheduler_simple_SMP_Insert_ready_lifo( } static void _Scheduler_simple_SMP_Insert_ready_fifo( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *thread ) { Scheduler_simple_SMP_Context *self = - _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); + _Scheduler_simple_SMP_Get_self( context ); _Chain_Insert_ordered_unprotected( &self->Ready, @@ -130,13 +132,13 @@ static void _Scheduler_simple_SMP_Insert_ready_fifo( } static void _Scheduler_simple_SMP_Do_extract( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *thread ) { Scheduler_SMP_Node *node = _Scheduler_SMP_Node_get( thread ); - (void) smp_base; + (void) context; if ( node->state == SCHEDULER_SMP_NODE_SCHEDULED ) { _Scheduler_SMP_Node_change_state( node, SCHEDULER_SMP_NODE_IN_THE_AIR ); @@ -156,7 +158,7 @@ void _Scheduler_simple_SMP_Block( _Scheduler_simple_SMP_Get_context( scheduler ); _Scheduler_SMP_Block( - &self->Base, + &self->Base.Base, thread, _Scheduler_simple_SMP_Do_extract, _Scheduler_simple_SMP_Get_highest_ready, @@ -165,7 +167,7 @@ void _Scheduler_simple_SMP_Block( } static void _Scheduler_simple_SMP_Enqueue_ordered( - Scheduler_SMP_Context *smp_base, + Scheduler_Context *context, Thread_Control *thread, Chain_Node_order order, Scheduler_SMP_Insert insert_ready, @@ -173,7 +175,7 @@ static void _Scheduler_simple_SMP_Enqueue_ordered( ) { _Scheduler_SMP_Enqueue_ordered( - smp_base, + context, thread, order, _Scheduler_simple_SMP_Get_highest_ready, @@ -193,7 +195,7 @@ void _Scheduler_simple_SMP_Enqueue_priority_lifo( _Scheduler_simple_SMP_Get_context( scheduler ); _Scheduler_simple_SMP_Enqueue_ordered( - &self->Base, + &self->Base.Base, thread, _Scheduler_simple_Insert_priority_lifo_order, _Scheduler_simple_SMP_Insert_ready_lifo, @@ -210,7 +212,7 @@ void _Scheduler_simple_SMP_Enqueue_priority_fifo( _Scheduler_simple_SMP_Get_context( scheduler ); _Scheduler_simple_SMP_Enqueue_ordered( - &self->Base, + &self->Base.Base, thread, _Scheduler_simple_Insert_priority_fifo_order, _Scheduler_simple_SMP_Insert_ready_fifo, @@ -227,7 +229,7 @@ void _Scheduler_simple_SMP_Extract( _Scheduler_simple_SMP_Get_context( scheduler ); _Scheduler_SMP_Extract( - &self->Base, + &self->Base.Base, thread, _Scheduler_simple_SMP_Do_extract ); @@ -257,7 +259,7 @@ void _Scheduler_simple_SMP_Schedule( _Scheduler_simple_SMP_Get_context( scheduler ); _Scheduler_SMP_Schedule( - &self->Base, + &self->Base.Base, thread, _Scheduler_simple_SMP_Get_highest_ready, _Scheduler_simple_SMP_Move_from_ready_to_scheduled @@ -273,5 +275,5 @@ void _Scheduler_simple_SMP_Start_idle( Scheduler_simple_SMP_Context *self = _Scheduler_simple_SMP_Get_context( scheduler ); - _Scheduler_SMP_Start_idle( &self->Base, thread, cpu ); + _Scheduler_SMP_Start_idle( &self->Base.Base, thread, cpu ); } -- cgit v1.2.3