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 | |
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')
-rw-r--r-- | cpukit/rtems/include/rtems/rtems/tasks.h | 2 | ||||
-rw-r--r-- | cpukit/rtems/src/schedulerident.c | 12 | ||||
-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 |
5 files changed, 29 insertions, 23 deletions
diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h index a9016ce3f3..43e8c8ac9d 100644 --- a/cpukit/rtems/include/rtems/rtems/tasks.h +++ b/cpukit/rtems/include/rtems/rtems/tasks.h @@ -597,6 +597,8 @@ rtems_id rtems_task_self(void); * @retval RTEMS_SUCCESSFUL Successful operation. * @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL. * @retval RTEMS_INVALID_NAME Invalid scheduler name. + * @retval RTEMS_UNSATISFIED A scheduler with this name exists, but the + * processor set of this scheduler is empty. */ rtems_status_code rtems_scheduler_ident( rtems_name name, diff --git a/cpukit/rtems/src/schedulerident.c b/cpukit/rtems/src/schedulerident.c index d9e913c946..ee18af009e 100644 --- a/cpukit/rtems/src/schedulerident.c +++ b/cpukit/rtems/src/schedulerident.c @@ -33,9 +33,15 @@ rtems_status_code rtems_scheduler_ident( sc = RTEMS_INVALID_NAME; for ( i = 0 ; i < n && sc == RTEMS_INVALID_NAME ; ++i ) { - if ( _Scheduler_Table[ i ].name == name ) { - *id = _Scheduler_Build_id( i ); - sc = RTEMS_SUCCESSFUL; + const Scheduler_Control *scheduler = &_Scheduler_Table[ i ]; + + if ( scheduler->name == name ) { + if ( _Scheduler_Get_processor_count( scheduler ) > 0 ) { + *id = _Scheduler_Build_id( i ); + sc = RTEMS_SUCCESSFUL; + } else { + sc = RTEMS_UNSATISFIED; + } } } } else { 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 ) |