diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-04-29 16:09:35 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-05-05 08:26:27 +0200 |
commit | e239760f6a6a5e31331487548d56c4a7581ed7cc (patch) | |
tree | f8f80f50df7562c7bb2209747c8544589212f45f /cpukit/score | |
parent | doc: Add SMP glossary (diff) | |
download | rtems-e239760f6a6a5e31331487548d56c4a7581ed7cc.tar.bz2 |
score: SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS
Avoid the SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS fatal error and make it
a run-time error in rtems_scheduler_ident() and _Scheduler_Get_by_id().
Diffstat (limited to 'cpukit/score')
-rw-r--r-- | cpukit/score/include/rtems/score/schedulerimpl.h | 21 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/smpimpl.h | 1 | ||||
-rw-r--r-- | cpukit/score/src/smp.c | 16 |
3 files changed, 18 insertions, 20 deletions
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h index 35054dfd3b..6fad4e2190 100644 --- a/cpukit/score/include/rtems/score/schedulerimpl.h +++ b/cpukit/score/include/rtems/score/schedulerimpl.h @@ -571,6 +571,19 @@ RTEMS_INLINE_ROUTINE void _Scheduler_Change_priority_if_higher( } } +RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_processor_count( + const Scheduler_Control *scheduler +) +{ +#if defined(RTEMS_SMP) + return scheduler->context->processor_count; +#else + (void) scheduler; + + return 1; +#endif +} + RTEMS_INLINE_ROUTINE Objects_Id _Scheduler_Build_id( uint32_t scheduler_index ) { return _Objects_Build_id( @@ -583,15 +596,17 @@ RTEMS_INLINE_ROUTINE Objects_Id _Scheduler_Build_id( uint32_t scheduler_index ) RTEMS_INLINE_ROUTINE bool _Scheduler_Get_by_id( Objects_Id id, - const Scheduler_Control **scheduler + const Scheduler_Control **scheduler_p ) { uint32_t minimum_id = _Scheduler_Build_id( 0 ); uint32_t index = id - minimum_id; + const Scheduler_Control *scheduler = &_Scheduler_Table[ index ]; - *scheduler = &_Scheduler_Table[ index ]; + *scheduler_p = scheduler; - return index < _Scheduler_Count; + return index < _Scheduler_Count + && _Scheduler_Get_processor_count( scheduler ) > 0; } RTEMS_INLINE_ROUTINE uint32_t _Scheduler_Get_index( diff --git a/cpukit/score/include/rtems/score/smpimpl.h b/cpukit/score/include/rtems/score/smpimpl.h index c281592bdc..27cf188131 100644 --- a/cpukit/score/include/rtems/score/smpimpl.h +++ b/cpukit/score/include/rtems/score/smpimpl.h @@ -52,7 +52,6 @@ typedef enum { SMP_FATAL_BOOT_PROCESSOR_NOT_ASSIGNED_TO_SCHEDULER, SMP_FATAL_MANDATORY_PROCESSOR_NOT_PRESENT, SMP_FATAL_MULTITASKING_START_ON_UNASSIGNED_PROCESSOR, - SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS, SMP_FATAL_START_OF_MANDATORY_PROCESSOR_FAILED } SMP_Fatal_code; diff --git a/cpukit/score/src/smp.c b/cpukit/score/src/smp.c index f03a4c05e4..34db46ad1e 100644 --- a/cpukit/score/src/smp.c +++ b/cpukit/score/src/smp.c @@ -25,20 +25,6 @@ #include <rtems/score/threadimpl.h> #include <rtems/config.h> -static void _SMP_Check_scheduler_configuration( void ) -{ - size_t n = _Scheduler_Count; - size_t i; - - for ( i = 0 ; i < n ; ++i ) { - const Scheduler_Control *scheduler = &_Scheduler_Table[ i ]; - - if ( scheduler->context->processor_count == 0 ) { - _SMP_Fatal( SMP_FATAL_SCHEDULER_WITHOUT_PROCESSORS ); - } - } -} - static void _SMP_Start_processors( uint32_t cpu_count ) { uint32_t cpu_index_self = _SMP_Get_current_processor(); @@ -75,8 +61,6 @@ static void _SMP_Start_processors( uint32_t cpu_count ) ++assignment->scheduler->context->processor_count; } } - - _SMP_Check_scheduler_configuration(); } void _SMP_Handler_initialize( void ) |