summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src')
-rw-r--r--cpukit/score/src/threadglobalconstruction.c94
-rw-r--r--cpukit/score/src/threadhandler.c84
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