diff options
Diffstat (limited to 'cpukit/score/src/threadcreateidle.c')
-rw-r--r-- | cpukit/score/src/threadcreateidle.c | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c index bea6a23b89..6a4bf65e9c 100644 --- a/cpukit/score/src/threadcreateidle.c +++ b/cpukit/score/src/threadcreateidle.c @@ -2,7 +2,7 @@ * Thread Handler * * - * COPYRIGHT (c) 1989-2008. + * COPYRIGHT (c) 1989-2011. * On-Line Applications Research Corporation (OAR). * * The license and distribution terms for this file may be @@ -30,24 +30,24 @@ #include <rtems/score/userext.h> #include <rtems/score/wkspace.h> #include <rtems/config.h> +#include <rtems/bspsmp.h> -/*PAGE - * - * _Thread_Create_idle - */ - -void _Thread_Create_idle( void ) +static inline void _Thread_Create_idle_helper( + uint32_t name_u32, + int cpu +) { - Objects_Name name; + Objects_Name name; + Thread_Control *idle; - name.name_u32 = _Objects_Build_name( 'I', 'D', 'L', 'E' ); + name.name_u32 = name_u32; /* * The entire workspace is zeroed during its initialization. Thus, all * fields not explicitly assigned were explicitly zeroed by * _Workspace_Initialization. */ - _Thread_Idle = _Thread_Internal_allocate(); + idle = _Thread_Internal_allocate(); /* * This is only called during initialization and we better be sure @@ -58,7 +58,7 @@ void _Thread_Create_idle( void ) _Thread_Initialize( &_Thread_Internal_information, - _Thread_Idle, + idle, NULL, /* allocate the stack */ _Stack_Ensure_minimum( Configuration.idle_task_stack_size ), CPU_IDLE_TASK_IS_FP, @@ -76,15 +76,31 @@ void _Thread_Create_idle( void ) * WARNING!!! This is necessary to "kick" start the system and * MUST be done before _Thread_Start is invoked. */ - _Thread_Heir = - _Thread_Executing = _Thread_Idle; + _Per_CPU_Information[ cpu ].idle = + _Per_CPU_Information[ cpu ].heir = + _Per_CPU_Information[ cpu ].executing = idle; _Thread_Start( - _Thread_Idle, + idle, THREAD_START_NUMERIC, Configuration.idle_task, NULL, 0 ); +} + +void _Thread_Create_idle( void ) +{ + #if defined(RTEMS_SMP) + int cpu; + for ( cpu=0 ; cpu < _SMP_Processor_count ; cpu++ ) { + _Thread_Create_idle_helper( + _Objects_Build_name( 'I', 'D', 'L', 'E' ), + cpu + ); + } + #else + _Thread_Create_idle_helper(_Objects_Build_name( 'I', 'D', 'L', 'E' ), 0); + #endif } |