diff options
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/threadglobalconstruction.c | 94 | ||||
-rw-r--r-- | cpukit/score/src/threadhandler.c | 84 |
2 files changed, 96 insertions, 82 deletions
diff --git a/cpukit/score/src/threadglobalconstruction.c b/cpukit/score/src/threadglobalconstruction.c new file mode 100644 index 0000000000..ff8af51242 --- /dev/null +++ b/cpukit/score/src/threadglobalconstruction.c @@ -0,0 +1,94 @@ +/** + * @file + * + * @brief Thread Global Construction + * + * @ingroup ScoreThread + */ + +/* + * COPYRIGHT (c) 1989-2012. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/score/threadimpl.h> +#include <rtems/score/assert.h> +#include <rtems/rtems/config.h> +#include <rtems/posix/config.h> + +/* + * Conditional magic to determine what style of C++ constructor + * initialization this target and compiler version uses. + */ +#if defined(__USE_INIT_FINI__) + #if defined(__M32R__) + #define INIT_NAME __init + #elif defined(__ARM_EABI__) + #define INIT_NAME __libc_init_array + #else + #define INIT_NAME _init + #endif + + extern void INIT_NAME(void); + #define EXECUTE_GLOBAL_CONSTRUCTORS +#endif + +#if defined(__USE__MAIN__) + extern void __main(void); + #define INIT_NAME __main + #define EXECUTE_GLOBAL_CONSTRUCTORS +#endif + +void *_Thread_Global_construction( void ) +{ + Thread_Control *executing; + Thread_Entry entry_point; + +#if defined(EXECUTE_GLOBAL_CONSTRUCTORS) + /* + * _init could be a weak symbol and we SHOULD test it but it isn't + * in any configuration I know of and it generates a warning on every + * RTEMS target configuration. --joel (12 May 2007) + */ + INIT_NAME(); +#endif + +#if defined(RTEMS_POSIX_API) + if ( Configuration_RTEMS_API.number_of_initialization_tasks > 0 ) { +#endif + entry_point = (Thread_Entry) + Configuration_RTEMS_API.User_initialization_tasks_table[ 0 ].entry_point; +#if defined(RTEMS_POSIX_API) + } else { + entry_point = (Thread_Entry) + Configuration_POSIX_API + .User_initialization_threads_table[ 0 ].thread_entry; + } +#endif + + _Thread_Disable_dispatch(); + + executing = _Thread_Executing; + executing->Start.entry_point = entry_point; + + _Thread_Restart( + executing, + executing, + executing->Start.pointer_argument, + executing->Start.numeric_argument + ); + + _Thread_Enable_dispatch(); + + _Assert_Not_reached(); + + return NULL; +} diff --git a/cpukit/score/src/threadhandler.c b/cpukit/score/src/threadhandler.c index 5f6623f11f..f8a9a62429 100644 --- a/cpukit/score/src/threadhandler.c +++ b/cpukit/score/src/threadhandler.c @@ -24,76 +24,11 @@ #include <rtems/score/isrlevel.h> #include <rtems/score/userextimpl.h> -/* - * Conditional magic to determine what style of C++ constructor - * initialization this target and compiler version uses. - */ -#if defined(__USE_INIT_FINI__) - #if defined(__M32R__) - #define INIT_NAME __init - #elif defined(__ARM_EABI__) - #define INIT_NAME __libc_init_array - #else - #define INIT_NAME _init - #endif - - extern void INIT_NAME(void); - #define EXECUTE_GLOBAL_CONSTRUCTORS -#endif - -#if defined(__USE__MAIN__) - extern void __main(void); - #define INIT_NAME __main - #define EXECUTE_GLOBAL_CONSTRUCTORS -#endif - -#if defined(EXECUTE_GLOBAL_CONSTRUCTORS) - static bool _Thread_Handler_is_constructor_execution_required( - Thread_Control *executing - ) - { - static bool doneConstructors; - bool doCons = false; - - #if defined(RTEMS_SMP) - static SMP_lock_Control constructor_lock = - SMP_LOCK_INITIALIZER("constructor"); - - SMP_lock_Context lock_context; - - if ( !doneConstructors ) { - _SMP_lock_Acquire( &constructor_lock, &lock_context ); - #endif - - #if defined(RTEMS_MULTIPROCESSING) - doCons = !doneConstructors - && _Objects_Get_API( executing->Object.id ) != OBJECTS_INTERNAL_API; - if (doCons) - doneConstructors = true; - #else - (void) executing; - doCons = !doneConstructors; - doneConstructors = true; - #endif - - #if defined(RTEMS_SMP) - _SMP_lock_Release( &constructor_lock, &lock_context ); - } - #endif - - return doCons; - } -#endif - void _Thread_Handler( void ) { - ISR_Level level; - Thread_Control *executing; - #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) - bool doCons; - #endif + Thread_Control *executing = _Thread_Executing; + ISR_Level level; - executing = _Thread_Executing; /* * Some CPUs need to tinker with the call frame or registers when the @@ -111,10 +46,6 @@ void _Thread_Handler( void ) _ISR_Set_level( level ); #endif - #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) - doCons = _Thread_Handler_is_constructor_execution_required( executing ); - #endif - /* * Initialize the floating point context because we do not come * through _Thread_Dispatch on our first invocation. So the normal @@ -171,17 +102,6 @@ void _Thread_Handler( void ) _Thread_Enable_dispatch(); #endif - #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) - /* - * _init could be a weak symbol and we SHOULD test it but it isn't - * in any configuration I know of and it generates a warning on every - * RTEMS target configuration. --joel (12 May 2007) - */ - if (doCons) /* && (volatile void *)_init) */ { - INIT_NAME (); - } - #endif - /* * RTEMS supports multiple APIs and each API can define a different * thread/task prototype. The following code supports invoking the |