summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-29 16:09:35 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-05-05 08:26:27 +0200
commite239760f6a6a5e31331487548d56c4a7581ed7cc (patch)
treef8f80f50df7562c7bb2209747c8544589212f45f /cpukit
parentdoc: Add SMP glossary (diff)
downloadrtems-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.h2
-rw-r--r--cpukit/rtems/src/schedulerident.c12
-rw-r--r--cpukit/score/include/rtems/score/schedulerimpl.h21
-rw-r--r--cpukit/score/include/rtems/score/smpimpl.h1
-rw-r--r--cpukit/score/src/smp.c16
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 )