From 24934e36e2513f972510d7c746103be1f766dc6a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 3 Apr 2014 15:03:35 +0200 Subject: score: Add scheduler control to scheduler ops Scheduler operations must be free of a global scheduler context to enable partitioned/clustered scheduling. --- cpukit/score/src/schedulersimplesmp.c | 90 ++++++++++++++++++++++------------- 1 file changed, 58 insertions(+), 32 deletions(-) (limited to 'cpukit/score/src/schedulersimplesmp.c') diff --git a/cpukit/score/src/schedulersimplesmp.c b/cpukit/score/src/schedulersimplesmp.c index d222d02d42..20a35af07a 100644 --- a/cpukit/score/src/schedulersimplesmp.c +++ b/cpukit/score/src/schedulersimplesmp.c @@ -22,16 +22,17 @@ #include #include -static Scheduler_simple_SMP_Control *_Scheduler_simple_SMP_Instance( void ) +static Scheduler_simple_SMP_Control * +_Scheduler_simple_SMP_Self_from_base( Scheduler_Control *base ) { - return _Scheduler.information; + return (Scheduler_simple_SMP_Control *) base->information; } static Scheduler_simple_SMP_Control * -_Scheduler_simple_SMP_Self_from_SMP_base( Scheduler_SMP_Control *base ) +_Scheduler_simple_SMP_Self_from_SMP_base( Scheduler_SMP_Control *smp_base ) { return (Scheduler_simple_SMP_Control *) - ( (char *) base - offsetof( Scheduler_simple_SMP_Control, Base ) ); + ( (char *) smp_base - offsetof( Scheduler_simple_SMP_Control, Base ) ); } void _Scheduler_simple_smp_Initialize( void ) @@ -46,11 +47,11 @@ void _Scheduler_simple_smp_Initialize( void ) } static Thread_Control *_Scheduler_simple_smp_Get_highest_ready( - Scheduler_SMP_Control *base + Scheduler_SMP_Control *smp_base ) { Scheduler_simple_SMP_Control *self = - _Scheduler_simple_SMP_Self_from_SMP_base( base ); + _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); Thread_Control *highest_ready = NULL; Chain_Control *ready = &self->Ready; @@ -62,12 +63,12 @@ static Thread_Control *_Scheduler_simple_smp_Get_highest_ready( } static void _Scheduler_simple_smp_Move_from_scheduled_to_ready( - Scheduler_SMP_Control *base, + Scheduler_SMP_Control *smp_base, Thread_Control *scheduled_to_ready ) { Scheduler_simple_SMP_Control *self = - _Scheduler_simple_SMP_Self_from_SMP_base( base ); + _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); _Chain_Extract_unprotected( &scheduled_to_ready->Object.Node ); _Scheduler_simple_Insert_priority_lifo( @@ -77,24 +78,24 @@ static void _Scheduler_simple_smp_Move_from_scheduled_to_ready( } static void _Scheduler_simple_smp_Move_from_ready_to_scheduled( - Scheduler_SMP_Control *base, + Scheduler_SMP_Control *smp_base, Thread_Control *ready_to_scheduled ) { _Chain_Extract_unprotected( &ready_to_scheduled->Object.Node ); _Scheduler_simple_Insert_priority_fifo( - &base->Scheduled, + &smp_base->Scheduled, ready_to_scheduled ); } static void _Scheduler_simple_smp_Insert_ready_lifo( - Scheduler_SMP_Control *base, + Scheduler_SMP_Control *smp_base, Thread_Control *thread ) { Scheduler_simple_SMP_Control *self = - _Scheduler_simple_SMP_Self_from_SMP_base( base ); + _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); _Chain_Insert_ordered_unprotected( &self->Ready, @@ -104,12 +105,12 @@ static void _Scheduler_simple_smp_Insert_ready_lifo( } static void _Scheduler_simple_smp_Insert_ready_fifo( - Scheduler_SMP_Control *base, + Scheduler_SMP_Control *smp_base, Thread_Control *thread ) { Scheduler_simple_SMP_Control *self = - _Scheduler_simple_SMP_Self_from_SMP_base( base ); + _Scheduler_simple_SMP_Self_from_SMP_base( smp_base ); _Chain_Insert_ordered_unprotected( &self->Ready, @@ -119,11 +120,11 @@ static void _Scheduler_simple_smp_Insert_ready_fifo( } static void _Scheduler_simple_smp_Do_extract( - Scheduler_SMP_Control *base, + Scheduler_SMP_Control *smp_base, Thread_Control *thread ) { - (void) base; + (void) smp_base; thread->is_in_the_air = thread->is_scheduled; thread->is_scheduled = false; @@ -131,9 +132,13 @@ static void _Scheduler_simple_smp_Do_extract( _Chain_Extract_unprotected( &thread->Object.Node ); } -void _Scheduler_simple_smp_Block( Thread_Control *thread ) +void _Scheduler_simple_smp_Block( + Scheduler_Control *base, + Thread_Control *thread +) { - Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance(); + Scheduler_simple_SMP_Control *self = + _Scheduler_simple_SMP_Self_from_base( base ); _Scheduler_SMP_Block( &self->Base, @@ -145,7 +150,7 @@ void _Scheduler_simple_smp_Block( Thread_Control *thread ) } static void _Scheduler_simple_smp_Enqueue_ordered( - Scheduler_SMP_Control *base, + Scheduler_SMP_Control *smp_base, Thread_Control *thread, Chain_Node_order order, Scheduler_SMP_Insert insert_ready, @@ -153,7 +158,7 @@ static void _Scheduler_simple_smp_Enqueue_ordered( ) { _Scheduler_SMP_Enqueue_ordered( - base, + smp_base, thread, order, _Scheduler_simple_smp_Get_highest_ready, @@ -164,9 +169,13 @@ static void _Scheduler_simple_smp_Enqueue_ordered( ); } -void _Scheduler_simple_smp_Enqueue_priority_lifo( Thread_Control *thread ) +void _Scheduler_simple_smp_Enqueue_priority_lifo( + Scheduler_Control *base, + Thread_Control *thread +) { - Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance(); + Scheduler_simple_SMP_Control *self = + _Scheduler_simple_SMP_Self_from_base( base ); _Scheduler_simple_smp_Enqueue_ordered( &self->Base, @@ -177,9 +186,13 @@ void _Scheduler_simple_smp_Enqueue_priority_lifo( Thread_Control *thread ) ); } -void _Scheduler_simple_smp_Enqueue_priority_fifo( Thread_Control *thread ) +void _Scheduler_simple_smp_Enqueue_priority_fifo( + Scheduler_Control *base, + Thread_Control *thread +) { - Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance(); + Scheduler_simple_SMP_Control *self = + _Scheduler_simple_SMP_Self_from_base( base ); _Scheduler_simple_smp_Enqueue_ordered( &self->Base, @@ -190,9 +203,13 @@ void _Scheduler_simple_smp_Enqueue_priority_fifo( Thread_Control *thread ) ); } -void _Scheduler_simple_smp_Extract( Thread_Control *thread ) +void _Scheduler_simple_smp_Extract( + Scheduler_Control *base, + Thread_Control *thread +) { - Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance(); + Scheduler_simple_SMP_Control *self = + _Scheduler_simple_SMP_Self_from_base( base ); _Scheduler_SMP_Extract( &self->Base, @@ -201,21 +218,28 @@ void _Scheduler_simple_smp_Extract( Thread_Control *thread ) ); } -void _Scheduler_simple_smp_Yield( Thread_Control *thread ) +void _Scheduler_simple_smp_Yield( + Scheduler_Control *base, + Thread_Control *thread +) { ISR_Level level; _ISR_Disable( level ); - _Scheduler_simple_smp_Extract( thread ); - _Scheduler_simple_smp_Enqueue_priority_fifo( thread ); + _Scheduler_simple_smp_Extract( base, thread ); + _Scheduler_simple_smp_Enqueue_priority_fifo( base, thread ); _ISR_Enable( level ); } -void _Scheduler_simple_smp_Schedule( Thread_Control *thread ) +void _Scheduler_simple_smp_Schedule( + Scheduler_Control *base, + Thread_Control *thread +) { - Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance(); + Scheduler_simple_SMP_Control *self = + _Scheduler_simple_SMP_Self_from_base( base ); _Scheduler_SMP_Schedule( &self->Base, @@ -226,11 +250,13 @@ void _Scheduler_simple_smp_Schedule( Thread_Control *thread ) } void _Scheduler_simple_smp_Start_idle( + Scheduler_Control *base, Thread_Control *thread, Per_CPU_Control *cpu ) { - Scheduler_simple_SMP_Control *self = _Scheduler_simple_SMP_Instance(); + Scheduler_simple_SMP_Control *self = + _Scheduler_simple_SMP_Self_from_base( base ); _Scheduler_SMP_Start_idle( &self->Base, thread, cpu ); } -- cgit v1.2.3