diff options
Diffstat (limited to 'cpukit/score/src/schedulerprioritysmp.c')
-rw-r--r-- | cpukit/score/src/schedulerprioritysmp.c | 115 |
1 files changed, 83 insertions, 32 deletions
diff --git a/cpukit/score/src/schedulerprioritysmp.c b/cpukit/score/src/schedulerprioritysmp.c index dedd270747..458d87bdb7 100644 --- a/cpukit/score/src/schedulerprioritysmp.c +++ b/cpukit/score/src/schedulerprioritysmp.c @@ -7,7 +7,7 @@ */ /* - * Copyright (c) 2013 embedded brains GmbH. All rights reserved. + * Copyright (c) 2013-2014 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -29,100 +29,141 @@ #include <rtems/score/schedulersmpimpl.h> #include <rtems/score/wkspace.h> +static Scheduler_priority_SMP_Control *_Scheduler_priority_SMP_Instance( void ) +{ + return _Scheduler.information; +} + +static Scheduler_priority_SMP_Control * +_Scheduler_priority_SMP_Self_from_SMP_base( Scheduler_SMP_Control *base ) +{ + return (Scheduler_priority_SMP_Control *) + ( (char *) base + - offsetof( Scheduler_priority_SMP_Control, Base ) ); +} + void _Scheduler_priority_SMP_Initialize( void ) { - Scheduler_SMP_Control *self = _Workspace_Allocate_or_fatal_error( + Scheduler_priority_SMP_Control *self = _Workspace_Allocate_or_fatal_error( sizeof( *self ) + PRIORITY_MAXIMUM * sizeof( Chain_Control ) ); - _Chain_Initialize_empty( &self->scheduled ); - _Scheduler_priority_Ready_queue_initialize( &self->ready[ 0 ] ); + _Scheduler_SMP_Initialize( &self->Base ); + _Priority_bit_map_Initialize( &self->Bit_map ); + _Scheduler_priority_Ready_queue_initialize( &self->Ready[ 0 ] ); _Scheduler.information = self; } void _Scheduler_priority_SMP_Update( Thread_Control *thread ) { - Scheduler_SMP_Control *self = _Scheduler_SMP_Instance(); + Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance(); - _Scheduler_priority_Update_body( thread, &self->ready[ 0 ] ); + _Scheduler_priority_Update_body( + thread, + &self->Bit_map, + &self->Ready[ 0 ] + ); } static Thread_Control *_Scheduler_priority_SMP_Get_highest_ready( - Scheduler_SMP_Control *self + Scheduler_SMP_Control *base ) { + Scheduler_priority_SMP_Control *self = + _Scheduler_priority_SMP_Self_from_SMP_base( base ); Thread_Control *highest_ready = NULL; - if ( !_Priority_bit_map_Is_empty() ) { - highest_ready = _Scheduler_priority_Ready_queue_first( &self->ready[ 0 ] ); + if ( !_Priority_bit_map_Is_empty( &self->Bit_map ) ) { + highest_ready = _Scheduler_priority_Ready_queue_first( + &self->Bit_map, + &self->Ready[ 0 ] + ); } return highest_ready; } static void _Scheduler_priority_SMP_Move_from_scheduled_to_ready( - Scheduler_SMP_Control *self, + Scheduler_SMP_Control *base, Thread_Control *scheduled_to_ready ) { + Scheduler_priority_SMP_Control *self = + _Scheduler_priority_SMP_Self_from_SMP_base( base ); + _Chain_Extract_unprotected( &scheduled_to_ready->Object.Node ); - _Scheduler_priority_Ready_queue_enqueue_first( scheduled_to_ready ); + _Scheduler_priority_Ready_queue_enqueue_first( + scheduled_to_ready, + &self->Bit_map + ); } static void _Scheduler_priority_SMP_Move_from_ready_to_scheduled( - Scheduler_SMP_Control *self, + Scheduler_SMP_Control *base, Thread_Control *ready_to_scheduled ) { - _Scheduler_priority_Ready_queue_extract( ready_to_scheduled ); + Scheduler_priority_SMP_Control *self = + _Scheduler_priority_SMP_Self_from_SMP_base( base ); + + _Scheduler_priority_Ready_queue_extract( + ready_to_scheduled, + &self->Bit_map + ); _Scheduler_simple_Insert_priority_fifo( - &self->scheduled, + &self->Base.Scheduled, ready_to_scheduled ); } static void _Scheduler_priority_SMP_Insert_ready_lifo( - Scheduler_SMP_Control *self, + Scheduler_SMP_Control *base, Thread_Control *thread ) { - _Scheduler_priority_Ready_queue_enqueue( thread ); + Scheduler_priority_SMP_Control *self = + _Scheduler_priority_SMP_Self_from_SMP_base( base ); + + _Scheduler_priority_Ready_queue_enqueue( thread, &self->Bit_map ); } static void _Scheduler_priority_SMP_Insert_ready_fifo( - Scheduler_SMP_Control *self, + Scheduler_SMP_Control *base, Thread_Control *thread ) { - _Scheduler_priority_Ready_queue_enqueue_first( thread ); + Scheduler_priority_SMP_Control *self = + _Scheduler_priority_SMP_Self_from_SMP_base( base ); + + _Scheduler_priority_Ready_queue_enqueue_first( thread, &self->Bit_map ); } static void _Scheduler_priority_SMP_Do_extract( - Scheduler_SMP_Control *self, + Scheduler_SMP_Control *base, Thread_Control *thread ) { + Scheduler_priority_SMP_Control *self = + _Scheduler_priority_SMP_Self_from_SMP_base( base ); bool is_scheduled = thread->is_scheduled; - ( void ) self; - thread->is_in_the_air = is_scheduled; thread->is_scheduled = false; if ( is_scheduled ) { _Chain_Extract_unprotected( &thread->Object.Node ); } else { - _Scheduler_priority_Ready_queue_extract( thread ); + _Scheduler_priority_Ready_queue_extract( thread, &self->Bit_map ); } } void _Scheduler_priority_SMP_Block( Thread_Control *thread ) { - Scheduler_SMP_Control *self = _Scheduler_SMP_Instance(); + Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance(); _Scheduler_SMP_Block( - self, + &self->Base, thread, _Scheduler_priority_SMP_Do_extract, _Scheduler_priority_SMP_Get_highest_ready, @@ -152,10 +193,10 @@ static void _Scheduler_priority_SMP_Enqueue_ordered( void _Scheduler_priority_SMP_Enqueue_lifo( Thread_Control *thread ) { - Scheduler_SMP_Control *self = _Scheduler_SMP_Instance(); + Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance(); _Scheduler_priority_SMP_Enqueue_ordered( - self, + &self->Base, thread, _Scheduler_simple_Insert_priority_lifo_order, _Scheduler_priority_SMP_Insert_ready_lifo, @@ -165,10 +206,10 @@ void _Scheduler_priority_SMP_Enqueue_lifo( Thread_Control *thread ) void _Scheduler_priority_SMP_Enqueue_fifo( Thread_Control *thread ) { - Scheduler_SMP_Control *self = _Scheduler_SMP_Instance(); + Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance(); _Scheduler_priority_SMP_Enqueue_ordered( - self, + &self->Base, thread, _Scheduler_simple_Insert_priority_fifo_order, _Scheduler_priority_SMP_Insert_ready_fifo, @@ -178,10 +219,10 @@ void _Scheduler_priority_SMP_Enqueue_fifo( Thread_Control *thread ) void _Scheduler_priority_SMP_Extract( Thread_Control *thread ) { - Scheduler_SMP_Control *self = _Scheduler_SMP_Instance(); + Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance(); _Scheduler_SMP_Extract( - self, + &self->Base, thread, _Scheduler_priority_SMP_Do_extract ); @@ -201,12 +242,22 @@ void _Scheduler_priority_SMP_Yield( Thread_Control *thread ) void _Scheduler_priority_SMP_Schedule( Thread_Control *thread ) { - Scheduler_SMP_Control *self = _Scheduler_SMP_Instance(); + Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance(); _Scheduler_SMP_Schedule( - self, + &self->Base, thread, _Scheduler_priority_SMP_Get_highest_ready, _Scheduler_priority_SMP_Move_from_ready_to_scheduled ); } + +void _Scheduler_priority_SMP_Start_idle( + Thread_Control *thread, + Per_CPU_Control *cpu +) +{ + Scheduler_priority_SMP_Control *self = _Scheduler_priority_SMP_Instance(); + + _Scheduler_SMP_Start_idle( &self->Base, thread, cpu ); +} |