summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-01-07 09:55:45 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-01-11 08:47:01 +0100
commitccd54344d904b657123e4e4ba795a32212382be2 (patch)
treed490d77b6173f586137036ed07ec5bd27d8ca65a
parentsmptests/README: Delete obsolete information (diff)
downloadrtems-ccd54344d904b657123e4e4ba795a32212382be2.tar.bz2
score: Introduce Thread_Entry_information
This avoids potential dead code in _Thread_Handler(). It gets rid of the dangerous function pointer casts. Update #2514.
-rw-r--r--c/src/lib/libbsp/arm/gdbarmsim/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/epiphany/epiphany_sim/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/i386/pc386/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/m32c/m32cbsp/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/moxie/moxiesim/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/sh/shsim/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/shared/clock_driver_simidle.c2
-rw-r--r--c/src/lib/libbsp/shared/clockdrv_shell.h4
-rw-r--r--c/src/lib/libbsp/sparc64/niagara/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/sparc64/usiii/include/bsp.h2
-rw-r--r--c/src/lib/libbsp/v850/gdbv850sim/include/bsp.h2
-rw-r--r--c/src/lib/libcpu/bfin/clock/clock.c4
-rw-r--r--c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c4
-rw-r--r--cpukit/libmisc/cpuuse/cpuusagetop.c2
-rw-r--r--cpukit/libmisc/monitor/mon-task.c3
-rw-r--r--cpukit/libmisc/monitor/monitor.h3
-rw-r--r--cpukit/posix/src/pthreadcreate.c18
-rw-r--r--cpukit/posix/src/pthreadinitthreads.c7
-rw-r--r--cpukit/rtems/src/taskinitusers.c7
-rw-r--r--cpukit/rtems/src/taskrestart.c5
-rw-r--r--cpukit/rtems/src/taskstart.c24
-rw-r--r--cpukit/sapi/include/rtems/config.h2
-rw-r--r--cpukit/score/Makefile.am3
-rw-r--r--cpukit/score/include/rtems/score/thread.h90
-rw-r--r--cpukit/score/include/rtems/score/threadimpl.h34
-rw-r--r--cpukit/score/src/threadcreateidle.c17
-rw-r--r--cpukit/score/src/threadentryadaptoridle.c26
-rw-r--r--cpukit/score/src/threadentryadaptornumeric.c26
-rw-r--r--cpukit/score/src/threadentryadaptorpointer.c26
-rw-r--r--cpukit/score/src/threadglobalconstruction.c19
-rw-r--r--cpukit/score/src/threadhandler.c37
-rw-r--r--cpukit/score/src/threadrestart.c10
-rw-r--r--cpukit/score/src/threadstart.c17
-rw-r--r--testsuites/samples/minimum/init.c11
-rw-r--r--testsuites/sptests/sp54/init.c9
-rw-r--r--testsuites/sptests/spintrcritical_support/intrcritical.c4
36 files changed, 234 insertions, 198 deletions
diff --git a/c/src/lib/libbsp/arm/gdbarmsim/include/bsp.h b/c/src/lib/libbsp/arm/gdbarmsim/include/bsp.h
index be69b6cd46..ccf3250884 100644
--- a/c/src/lib/libbsp/arm/gdbarmsim/include/bsp.h
+++ b/c/src/lib/libbsp/arm/gdbarmsim/include/bsp.h
@@ -45,7 +45,7 @@ extern "C" {
/**
* @brief Support for simulated clock tick
*/
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
/*
diff --git a/c/src/lib/libbsp/epiphany/epiphany_sim/include/bsp.h b/c/src/lib/libbsp/epiphany/epiphany_sim/include/bsp.h
index e9c5b55b34..b9e7fead5e 100644
--- a/c/src/lib/libbsp/epiphany/epiphany_sim/include/bsp.h
+++ b/c/src/lib/libbsp/epiphany/epiphany_sim/include/bsp.h
@@ -56,7 +56,7 @@ extern "C" {
*
* @{
*/
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
/** @} */
diff --git a/c/src/lib/libbsp/i386/pc386/include/bsp.h b/c/src/lib/libbsp/i386/pc386/include/bsp.h
index d9f24e47b4..d68af4d9db 100644
--- a/c/src/lib/libbsp/i386/pc386/include/bsp.h
+++ b/c/src/lib/libbsp/i386/pc386/include/bsp.h
@@ -198,7 +198,7 @@ void rtems_irq_mngt_init(void); /* from 'irq_init.c' */
*
* @brief Clock Tick Support Package
*/
- Thread clock_driver_sim_idle_body(uintptr_t);
+ void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
/*
* hack to kill some time. Hopefully hitting a hardware register is slower
diff --git a/c/src/lib/libbsp/m32c/m32cbsp/include/bsp.h b/c/src/lib/libbsp/m32c/m32cbsp/include/bsp.h
index 2889808fd8..e5c013713e 100644
--- a/c/src/lib/libbsp/m32c/m32cbsp/include/bsp.h
+++ b/c/src/lib/libbsp/m32c/m32cbsp/include/bsp.h
@@ -42,7 +42,7 @@ extern "C" {
* @brief Clock Tick Support Package
*/
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
#ifdef __cplusplus
diff --git a/c/src/lib/libbsp/moxie/moxiesim/include/bsp.h b/c/src/lib/libbsp/moxie/moxiesim/include/bsp.h
index 7ccc0725b4..599ce18dcd 100644
--- a/c/src/lib/libbsp/moxie/moxiesim/include/bsp.h
+++ b/c/src/lib/libbsp/moxie/moxiesim/include/bsp.h
@@ -28,7 +28,7 @@ extern "C" {
#endif
/* support for simulated clock tick */
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
#ifdef __cplusplus
diff --git a/c/src/lib/libbsp/sh/shsim/include/bsp.h b/c/src/lib/libbsp/sh/shsim/include/bsp.h
index 65b55fa13e..d8141480aa 100644
--- a/c/src/lib/libbsp/sh/shsim/include/bsp.h
+++ b/c/src/lib/libbsp/sh/shsim/include/bsp.h
@@ -44,7 +44,7 @@ extern "C" {
/* Constants */
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
/*
diff --git a/c/src/lib/libbsp/shared/clock_driver_simidle.c b/c/src/lib/libbsp/shared/clock_driver_simidle.c
index ee4b116b40..09544115a4 100644
--- a/c/src/lib/libbsp/shared/clock_driver_simidle.c
+++ b/c/src/lib/libbsp/shared/clock_driver_simidle.c
@@ -46,7 +46,7 @@ volatile bool clock_driver_enabled;
* fake time passing. This will not let preemption from an
* interrupt work but is enough for many tests.
*/
-Thread clock_driver_sim_idle_body(
+void *clock_driver_sim_idle_body(
uintptr_t ignored
)
{
diff --git a/c/src/lib/libbsp/shared/clockdrv_shell.h b/c/src/lib/libbsp/shared/clockdrv_shell.h
index d546fb81e7..ee4cf9c239 100644
--- a/c/src/lib/libbsp/shared/clockdrv_shell.h
+++ b/c/src/lib/libbsp/shared/clockdrv_shell.h
@@ -105,8 +105,8 @@ rtems_isr Clock_isr(
while (
_Thread_Heir == _Thread_Executing
- && _Thread_Executing->Start.entry_point
- == (Thread_Entry) rtems_configuration_get_idle_task()
+ && _Thread_Executing->Start.Entry.Kinds.Idle.entry
+ == rtems_configuration_get_idle_task()
) {
_Timecounter_Tick_simple(interval, (*tc->tc_get_timecount)(tc));
}
diff --git a/c/src/lib/libbsp/sparc64/niagara/include/bsp.h b/c/src/lib/libbsp/sparc64/niagara/include/bsp.h
index 0eb31300ea..90f633acfd 100644
--- a/c/src/lib/libbsp/sparc64/niagara/include/bsp.h
+++ b/c/src/lib/libbsp/sparc64/niagara/include/bsp.h
@@ -26,7 +26,7 @@ extern "C" {
/* support for simulated clock tick */
/*
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
*/
diff --git a/c/src/lib/libbsp/sparc64/usiii/include/bsp.h b/c/src/lib/libbsp/sparc64/usiii/include/bsp.h
index 3db442a18a..f07e469275 100644
--- a/c/src/lib/libbsp/sparc64/usiii/include/bsp.h
+++ b/c/src/lib/libbsp/sparc64/usiii/include/bsp.h
@@ -27,7 +27,7 @@ extern "C" {
/* support for simulated clock tick */
/*
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
*/
diff --git a/c/src/lib/libbsp/v850/gdbv850sim/include/bsp.h b/c/src/lib/libbsp/v850/gdbv850sim/include/bsp.h
index 6942eefd09..1da94354cf 100644
--- a/c/src/lib/libbsp/v850/gdbv850sim/include/bsp.h
+++ b/c/src/lib/libbsp/v850/gdbv850sim/include/bsp.h
@@ -28,7 +28,7 @@ extern "C" {
#endif
/* support for simulated clock tick */
-Thread clock_driver_sim_idle_body(uintptr_t);
+void *clock_driver_sim_idle_body(uintptr_t);
#define BSP_IDLE_TASK_BODY clock_driver_sim_idle_body
#ifdef __cplusplus
diff --git a/c/src/lib/libcpu/bfin/clock/clock.c b/c/src/lib/libcpu/bfin/clock/clock.c
index 5660f2af95..9798d05a51 100644
--- a/c/src/lib/libcpu/bfin/clock/clock.c
+++ b/c/src/lib/libcpu/bfin/clock/clock.c
@@ -37,8 +37,8 @@ static rtems_isr clockISR(rtems_vector_number vector) {
rtems_clock_tick();
} while (
_Thread_Heir == _Thread_Executing
- && _Thread_Executing->Start.entry_point
- == (Thread_Entry) rtems_configuration_get_idle_task()
+ && _Thread_Executing->Start.Entry.Kinds.Idle.entry
+ == rtems_configuration_get_idle_task()
);
#else
rtems_clock_tick();
diff --git a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c b/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
index e8dd30edb7..17a66531e9 100644
--- a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
+++ b/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c
@@ -107,8 +107,8 @@ static void clockHandler(void)
while (
_Thread_Heir == _Thread_Executing
- && _Thread_Executing->Start.entry_point
- == (Thread_Entry) rtems_configuration_get_idle_task()
+ && _Thread_Executing->Start.Entry.Kinds.Idle.entry
+ == rtems_configuration_get_idle_task()
) {
tb += Clock_Decrementer_value;
ppc_set_time_base( tb );
diff --git a/cpukit/libmisc/cpuuse/cpuusagetop.c b/cpukit/libmisc/cpuuse/cpuusagetop.c
index eaa192aa74..811a8bfa07 100644
--- a/cpukit/libmisc/cpuuse/cpuusagetop.c
+++ b/cpukit/libmisc/cpuuse/cpuusagetop.c
@@ -484,7 +484,7 @@ rtems_cpuusage_top_thread (rtems_task_argument arg)
*/
rtems_object_get_name(thread->Object.id, sizeof(name), name);
if (name[0] == '\0')
- snprintf(name, sizeof(name) - 1, "(%p)", thread->Start.entry_point);
+ snprintf(name, sizeof(name) - 1, "(%p)", thread->Start.Entry.Kinds.Numeric.entry);
(*data->plugin.print)(data->plugin.context,
" 0x%08" PRIx32 " | %-19s | %3" PRId32 " | %3" PRId32 " | ",
diff --git a/cpukit/libmisc/monitor/mon-task.c b/cpukit/libmisc/monitor/mon-task.c
index 910dd9db28..341a403ef6 100644
--- a/cpukit/libmisc/monitor/mon-task.c
+++ b/cpukit/libmisc/monitor/mon-task.c
@@ -25,8 +25,7 @@ rtems_monitor_task_canonical(
api = rtems_thread->API_Extensions[ THREAD_API_RTEMS ];
- canonical_task->entry = rtems_thread->Start.entry_point;
- canonical_task->argument = rtems_thread->Start.numeric_argument;
+ canonical_task->entry = rtems_thread->Start.Entry;
canonical_task->stack = rtems_thread->Start.Initial_stack.area;
canonical_task->stack_size = rtems_thread->Start.Initial_stack.size;
canonical_task->cpu = _Per_CPU_Get_index( _Thread_Get_CPU( rtems_thread ) );
diff --git a/cpukit/libmisc/monitor/monitor.h b/cpukit/libmisc/monitor/monitor.h
index ccd907b501..e2575cc931 100644
--- a/cpukit/libmisc/monitor/monitor.h
+++ b/cpukit/libmisc/monitor/monitor.h
@@ -95,8 +95,7 @@ typedef struct {
rtems_id id;
rtems_name name;
/* end of common portion */
- Thread_Entry entry;
- Thread_Entry_numeric_type argument;
+ Thread_Entry_information entry;
void *stack;
uint32_t stack_size;
uint32_t cpu;
diff --git a/cpukit/posix/src/pthreadcreate.c b/cpukit/posix/src/pthreadcreate.c
index 59c4e66e9d..611477ec69 100644
--- a/cpukit/posix/src/pthreadcreate.c
+++ b/cpukit/posix/src/pthreadcreate.c
@@ -52,6 +52,15 @@ int pthread_create(
void *arg
)
{
+ Thread_Entry_information entry = {
+ .adaptor = _Thread_Entry_adaptor_pointer,
+ .Kinds = {
+ .Pointer = {
+ .entry = start_routine,
+ .argument = arg
+ }
+ }
+ };
const pthread_attr_t *the_attr;
Priority_Control core_priority;
Thread_CPU_budget_algorithms budget_algorithm;
@@ -219,14 +228,7 @@ int pthread_create(
/*
* POSIX threads are allocated and started in one operation.
*/
- status = _Thread_Start(
- the_thread,
- THREAD_START_POINTER,
- start_routine,
- arg,
- 0, /* unused */
- NULL
- );
+ status = _Thread_Start( the_thread, &entry, NULL );
#if defined(RTEMS_DEBUG)
/*
diff --git a/cpukit/posix/src/pthreadinitthreads.c b/cpukit/posix/src/pthreadinitthreads.c
index 5accf3907c..c1f9340f63 100644
--- a/cpukit/posix/src/pthreadinitthreads.c
+++ b/cpukit/posix/src/pthreadinitthreads.c
@@ -37,11 +37,14 @@
static void *_POSIX_Global_construction( void *arg )
{
- Thread_Entry entry_point = (Thread_Entry) Configuration_POSIX_API
+ Thread_Control *executing = _Thread_Get_executing();
+ Thread_Entry_information entry = executing->Start.Entry;
+
+ entry.Kinds.Pointer.entry = Configuration_POSIX_API
.User_initialization_threads_table[ 0 ].thread_entry;
(void) arg;
- _Thread_Global_construction( entry_point );
+ _Thread_Global_construction( executing, &entry );
}
void _POSIX_Threads_Initialize_user_threads_body(void)
diff --git a/cpukit/rtems/src/taskinitusers.c b/cpukit/rtems/src/taskinitusers.c
index f5c2f82995..aeed5b4523 100644
--- a/cpukit/rtems/src/taskinitusers.c
+++ b/cpukit/rtems/src/taskinitusers.c
@@ -33,11 +33,14 @@
static void _RTEMS_Global_construction( rtems_task_argument arg )
{
- Thread_Entry entry_point = (Thread_Entry)
+ Thread_Control *executing = _Thread_Get_executing();
+ Thread_Entry_information entry = executing->Start.Entry;
+
+ entry.Kinds.Numeric.entry =
Configuration_RTEMS_API.User_initialization_tasks_table[ 0 ].entry_point;
(void) arg;
- _Thread_Global_construction( entry_point );
+ _Thread_Global_construction( executing, &entry );
}
/*
diff --git a/cpukit/rtems/src/taskrestart.c b/cpukit/rtems/src/taskrestart.c
index 0b56ed5b18..8aa7c73d9a 100644
--- a/cpukit/rtems/src/taskrestart.c
+++ b/cpukit/rtems/src/taskrestart.c
@@ -28,12 +28,15 @@ rtems_status_code rtems_task_restart(
{
Thread_Control *the_thread;
Objects_Locations location;
+ Thread_Entry_information entry;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
case OBJECTS_LOCAL:
- if ( _Thread_Restart( the_thread, _Thread_Executing, NULL, argument ) ) {
+ entry = the_thread->Start.Entry;
+ entry.Kinds.Numeric.argument = argument;
+ if ( _Thread_Restart( the_thread, _Thread_Executing, &entry ) ) {
_Objects_Put( &the_thread->Object );
return RTEMS_SUCCESSFUL;
}
diff --git a/cpukit/rtems/src/taskstart.c b/cpukit/rtems/src/taskstart.c
index d6f15d8624..39b3e9ca1d 100644
--- a/cpukit/rtems/src/taskstart.c
+++ b/cpukit/rtems/src/taskstart.c
@@ -44,9 +44,18 @@ rtems_status_code rtems_task_start(
rtems_task_argument argument
)
{
- Thread_Control *the_thread;
- Objects_Locations location;
- bool successfully_started;
+ Thread_Entry_information entry = {
+ .adaptor = _Thread_Entry_adaptor_numeric,
+ .Kinds = {
+ .Numeric = {
+ .entry = entry_point,
+ .argument = argument
+ }
+ }
+ };
+ Thread_Control *the_thread;
+ Objects_Locations location;
+ bool successfully_started;
if ( entry_point == NULL )
return RTEMS_INVALID_ADDRESS;
@@ -55,14 +64,7 @@ rtems_status_code rtems_task_start(
switch ( location ) {
case OBJECTS_LOCAL:
- successfully_started = _Thread_Start(
- the_thread,
- THREAD_START_NUMERIC,
- entry_point,
- NULL,
- argument,
- NULL
- );
+ successfully_started = _Thread_Start( the_thread, &entry, NULL );
_Objects_Put( &the_thread->Object );
diff --git a/cpukit/sapi/include/rtems/config.h b/cpukit/sapi/include/rtems/config.h
index 9a9d0a3694..d73e9b8041 100644
--- a/cpukit/sapi/include/rtems/config.h
+++ b/cpukit/sapi/include/rtems/config.h
@@ -181,7 +181,7 @@ typedef struct {
* This element points to the BSP's optional idle task which may override
* the default one provided with RTEMS.
*/
- Thread (*idle_task)( uintptr_t );
+ void *(*idle_task)( uintptr_t );
/**
* This field specifies the size of the IDLE task's stack. If less than or
diff --git a/cpukit/score/Makefile.am b/cpukit/score/Makefile.am
index 04c5c87cde..6593805c5c 100644
--- a/cpukit/score/Makefile.am
+++ b/cpukit/score/Makefile.am
@@ -301,6 +301,9 @@ libscore_a_SOURCES += src/thread.c src/threadchangepriority.c \
src/threadsetstate.c \
src/threadstackallocate.c src/threadstackfree.c src/threadstart.c \
src/threadstartmultitasking.c src/iterateoverthreads.c
+libscore_a_SOURCES += src/threadentryadaptoridle.c
+libscore_a_SOURCES += src/threadentryadaptornumeric.c
+libscore_a_SOURCES += src/threadentryadaptorpointer.c
libscore_a_SOURCES += src/threadglobalconstruction.c
libscore_a_SOURCES += src/threadtimeout.c
libscore_a_SOURCES += src/threadyield.c
diff --git a/cpukit/score/include/rtems/score/thread.h b/cpukit/score/include/rtems/score/thread.h
index 6e937e39de..f4d76d8725 100644
--- a/cpukit/score/include/rtems/score/thread.h
+++ b/cpukit/score/include/rtems/score/thread.h
@@ -88,15 +88,11 @@ extern "C" {
typedef Timestamp_Control Thread_CPU_usage_t;
-/**
- * The following defines the "return type" of a thread.
- *
- * @note This cannot always be right. Some APIs have void
- * tasks/threads, others return pointers, others may
- * return a numeric value. Hopefully a pointer is
- * always at least as big as an uint32_t . :)
+/*
+ * Only provided for backward compatiblity to not break application
+ * configurations.
*/
-typedef void *Thread;
+typedef void *Thread RTEMS_DEPRECATED;
/**
* @brief Type of the numeric argument of a thread entry function with at
@@ -110,44 +106,52 @@ typedef void *Thread;
typedef CPU_Uint32ptr Thread_Entry_numeric_type;
/**
- * The following defines the ways in which the entry point for a
- * thread can be invoked. Basically, it can be passed any
- * combination/permutation of a pointer and an uint32_t value.
- *
- * @note For now, we are ignoring the return type.
+ * @brief Data for idle thread entry.
*/
-typedef enum {
- THREAD_START_NUMERIC,
- THREAD_START_POINTER,
- #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
- THREAD_START_BOTH_POINTER_FIRST,
- THREAD_START_BOTH_NUMERIC_FIRST
- #endif
-} Thread_Start_types;
-
-/** This type corresponds to a very simple style thread entry point. */
-typedef Thread ( *Thread_Entry )( void ); /* basic type */
+typedef struct {
+ void *( *entry )( uintptr_t argument );
+} Thread_Entry_idle;
-/** This type corresponds to a thread entry point which takes a single
- * unsigned thirty-two bit integer as an argument.
+/**
+ * @brief Data for thread entry with one numeric argument and no return value.
*/
-typedef Thread ( *Thread_Entry_numeric )( Thread_Entry_numeric_type );
+typedef struct {
+ void ( *entry )( Thread_Entry_numeric_type argument );
+ Thread_Entry_numeric_type argument;
+} Thread_Entry_numeric;
-/** This type corresponds to a thread entry point which takes a single
- * untyped pointer as an argument.
+/**
+ * @brief Data for thread entry with one pointer argument and a pointer return
+ * value.
*/
-typedef Thread ( *Thread_Entry_pointer )( void * );
+typedef struct {
+ void *( *entry )( void *argument );
+ void *argument;
+} Thread_Entry_pointer;
-/** This type corresponds to a thread entry point which takes a single
- * untyped pointer and an unsigned thirty-two bit integer as arguments.
+/**
+ * @brief Thread entry information.
*/
-typedef Thread ( *Thread_Entry_both_pointer_first )( void *, Thread_Entry_numeric_type );
+typedef struct {
+ /**
+ * @brief Thread entry adaptor.
+ *
+ * Calls the corresponding thread entry with the right parameters.
+ *
+ * @param executing The executing thread.
+ */
+ void ( *adaptor )( Thread_Control *executing );
-/** This type corresponds to a thread entry point which takes a single
- * unsigned thirty-two bit integer and an untyped pointer and an
- * as arguments.
- */
-typedef Thread ( *Thread_Entry_both_numeric_first )( Thread_Entry_numeric_type, void * );
+ /**
+ * @brief Thread entry data used by the adaptor to call the thread entry
+ * function with the right parameters.
+ */
+ union {
+ Thread_Entry_idle Idle;
+ Thread_Entry_numeric Numeric;
+ Thread_Entry_pointer Pointer;
+ } Kinds;
+} Thread_Entry_information;
/**
* The following lists the algorithms used to manage the thread cpu budget.
@@ -206,14 +210,8 @@ typedef struct {
* the starting state of a thread.
*/
typedef struct {
- /** This field is the starting address for the thread. */
- Thread_Entry entry_point;
- /** This field indicates the how task is invoked. */
- Thread_Start_types prototype;
- /** This field is the pointer argument passed at thread start. */
- void *pointer_argument;
- /** This field is the numeric argument passed at thread start. */
- Thread_Entry_numeric_type numeric_argument;
+ /** This field contains the thread entry information. */
+ Thread_Entry_information Entry;
/*-------------- initial execution modes ----------------- */
/** This field indicates whether the thread was preemptible when
* it started.
diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h
index abdd7e6f57..f212e23928 100644
--- a/cpukit/score/include/rtems/score/threadimpl.h
+++ b/cpukit/score/include/rtems/score/threadimpl.h
@@ -185,29 +185,22 @@ bool _Thread_Initialize(
* and makes it ready to execute. After this routine executes, the
* thread competes with all other threads for CPU time.
*
- * @param the_thread is the thread to be initialized
- * @param the_prototype
- * @param entry_point
- * @param pointer_argument
- * @param numeric_argument
+ * @param the_thread The thread to be started.
+ * @param entry The thread entry information.
* @param[in,out] cpu The processor if used to start an idle thread
* during system initialization. Must be set to @c NULL to start a normal
* thread.
*/
bool _Thread_Start(
- Thread_Control *the_thread,
- Thread_Start_types the_prototype,
- void *entry_point,
- void *pointer_argument,
- Thread_Entry_numeric_type numeric_argument,
- Per_CPU_Control *cpu
+ Thread_Control *the_thread,
+ const Thread_Entry_information *entry,
+ Per_CPU_Control *cpu
);
bool _Thread_Restart(
- Thread_Control *the_thread,
- Thread_Control *executing,
- void *pointer_argument,
- Thread_Entry_numeric_type numeric_argument
+ Thread_Control *the_thread,
+ Thread_Control *executing,
+ const Thread_Entry_information *entry
);
void _Thread_Yield( Thread_Control *executing );
@@ -300,6 +293,12 @@ void _Thread_Load_environment(
Thread_Control *the_thread
);
+void _Thread_Entry_adaptor_idle( Thread_Control *executing );
+
+void _Thread_Entry_adaptor_numeric( Thread_Control *executing );
+
+void _Thread_Entry_adaptor_pointer( Thread_Control *executing );
+
/**
* @brief Wrapper function for all threads.
*
@@ -325,7 +324,10 @@ void _Thread_Handler( void );
* the first POSIX initialization thread in case no RTEMS initialization tasks
* are present.
*/
-void _Thread_Global_construction( Thread_Entry entry_point ) RTEMS_NO_RETURN;
+void _Thread_Global_construction(
+ Thread_Control *executing,
+ const Thread_Entry_information *entry
+) RTEMS_NO_RETURN;
/**
* @brief Ended the delay of a thread.
diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c
index 8a5812f1a5..e9d12dc963 100644
--- a/cpukit/score/src/threadcreateidle.c
+++ b/cpukit/score/src/threadcreateidle.c
@@ -25,6 +25,14 @@
static void _Thread_Create_idle_for_cpu( Per_CPU_Control *cpu )
{
+ Thread_Entry_information entry = {
+ .adaptor = _Thread_Entry_adaptor_idle,
+ .Kinds = {
+ .Idle = {
+ .entry = rtems_configuration_get_idle_task()
+ }
+ }
+ };
Objects_Name name;
Thread_Control *idle;
@@ -59,14 +67,7 @@ static void _Thread_Create_idle_for_cpu( Per_CPU_Control *cpu )
cpu->heir =
cpu->executing = idle;
- _Thread_Start(
- idle,
- THREAD_START_NUMERIC,
- rtems_configuration_get_idle_task(),
- NULL,
- 0,
- cpu
- );
+ _Thread_Start( idle, &entry, cpu );
}
void _Thread_Create_idle( void )
diff --git a/cpukit/score/src/threadentryadaptoridle.c b/cpukit/score/src/threadentryadaptoridle.c
new file mode 100644
index 0000000000..e98f562a30
--- /dev/null
+++ b/cpukit/score/src/threadentryadaptoridle.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2015 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * 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>
+
+void _Thread_Entry_adaptor_idle( Thread_Control *executing )
+{
+ const Thread_Entry_idle *idle = &executing->Start.Entry.Kinds.Idle;
+
+ ( *idle->entry )( 0 );
+}
diff --git a/cpukit/score/src/threadentryadaptornumeric.c b/cpukit/score/src/threadentryadaptornumeric.c
new file mode 100644
index 0000000000..acc06f0614
--- /dev/null
+++ b/cpukit/score/src/threadentryadaptornumeric.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2015 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * 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>
+
+void _Thread_Entry_adaptor_numeric( Thread_Control *executing )
+{
+ const Thread_Entry_numeric *numeric = &executing->Start.Entry.Kinds.Numeric;
+
+ ( *numeric->entry )( numeric->argument );
+}
diff --git a/cpukit/score/src/threadentryadaptorpointer.c b/cpukit/score/src/threadentryadaptorpointer.c
new file mode 100644
index 0000000000..65866d886f
--- /dev/null
+++ b/cpukit/score/src/threadentryadaptorpointer.c
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2015 embedded brains GmbH. All rights reserved.
+ *
+ * embedded brains GmbH
+ * Dornierstr. 4
+ * 82178 Puchheim
+ * Germany
+ * <rtems@embedded-brains.de>
+ *
+ * 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>
+
+void _Thread_Entry_adaptor_pointer( Thread_Control *executing )
+{
+ const Thread_Entry_pointer *pointer = &executing->Start.Entry.Kinds.Pointer;
+
+ executing->Wait.return_argument = ( *pointer->entry )( pointer->argument );
+}
diff --git a/cpukit/score/src/threadglobalconstruction.c b/cpukit/score/src/threadglobalconstruction.c
index 56a6df11a9..1e84124c55 100644
--- a/cpukit/score/src/threadglobalconstruction.c
+++ b/cpukit/score/src/threadglobalconstruction.c
@@ -44,10 +44,11 @@
#define EXECUTE_GLOBAL_CONSTRUCTORS
#endif
-void _Thread_Global_construction( Thread_Entry entry_point )
+void _Thread_Global_construction(
+ Thread_Control *executing,
+ const Thread_Entry_information *entry
+)
{
- Thread_Control *executing;
-
#if defined(EXECUTE_GLOBAL_CONSTRUCTORS)
/*
* _init could be a weak symbol and we SHOULD test it but it isn't
@@ -58,17 +59,7 @@ void _Thread_Global_construction( Thread_Entry entry_point )
#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_Restart( executing, executing, entry );
_Thread_Enable_dispatch();
_Assert_Not_reached();
diff --git a/cpukit/score/src/threadhandler.c b/cpukit/score/src/threadhandler.c
index fd828a2325..2429de57bc 100644
--- a/cpukit/score/src/threadhandler.c
+++ b/cpukit/score/src/threadhandler.c
@@ -90,41 +90,12 @@ void _Thread_Handler( void )
* thread/task prototype. The following code supports invoking the
* user thread entry point using the prototype expected.
*/
- if ( executing->Start.prototype == THREAD_START_NUMERIC ) {
- executing->Wait.return_argument =
- (*(Thread_Entry_numeric) executing->Start.entry_point)(
- executing->Start.numeric_argument
- );
- }
- #if defined(RTEMS_POSIX_API)
- else if ( executing->Start.prototype == THREAD_START_POINTER ) {
- executing->Wait.return_argument =
- (*(Thread_Entry_pointer) executing->Start.entry_point)(
- executing->Start.pointer_argument
- );
- }
- #endif
- #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API)
- else if ( executing->Start.prototype == THREAD_START_BOTH_POINTER_FIRST ) {
- executing->Wait.return_argument =
- (*(Thread_Entry_both_pointer_first) executing->Start.entry_point)(
- executing->Start.pointer_argument,
- executing->Start.numeric_argument
- );
- }
- else if ( executing->Start.prototype == THREAD_START_BOTH_NUMERIC_FIRST ) {
- executing->Wait.return_argument =
- (*(Thread_Entry_both_numeric_first) executing->Start.entry_point)(
- executing->Start.numeric_argument,
- executing->Start.pointer_argument
- );
- }
- #endif
+ ( *executing->Start.Entry.adaptor )( executing );
/*
- * In the switch above, the return code from the user thread body
- * was placed in return_argument. This assumed that if it returned
- * anything (which is not supporting in all APIs), then it would be
+ * In the call above, the return code from the user thread body which return
+ * something was placed in return_argument. This assumed that if it
+ * returned anything (which is not supporting in all APIs), then it would be
* able to fit in a (void *).
*/
diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c
index 2b1fef94fc..03b1fba8ff 100644
--- a/cpukit/score/src/threadrestart.c
+++ b/cpukit/score/src/threadrestart.c
@@ -356,15 +356,13 @@ void _Thread_Close( Thread_Control *the_thread, Thread_Control *executing )
}
bool _Thread_Restart(
- Thread_Control *the_thread,
- Thread_Control *executing,
- void *pointer_argument,
- Thread_Entry_numeric_type numeric_argument
+ Thread_Control *the_thread,
+ Thread_Control *executing,
+ const Thread_Entry_information *entry
)
{
if ( !_States_Is_dormant( the_thread->current_state ) ) {
- the_thread->Start.pointer_argument = pointer_argument;
- the_thread->Start.numeric_argument = numeric_argument;
+ the_thread->Start.Entry = *entry;
_Thread_Request_life_change(
the_thread,
diff --git a/cpukit/score/src/threadstart.c b/cpukit/score/src/threadstart.c
index dda9495a35..97399ba524 100644
--- a/cpukit/score/src/threadstart.c
+++ b/cpukit/score/src/threadstart.c
@@ -25,22 +25,13 @@
#include <rtems/score/userextimpl.h>
bool _Thread_Start(
- Thread_Control *the_thread,
- Thread_Start_types the_prototype,
- void *entry_point,
- void *pointer_argument,
- Thread_Entry_numeric_type numeric_argument,
- Per_CPU_Control *cpu
+ Thread_Control *the_thread,
+ const Thread_Entry_information *entry,
+ Per_CPU_Control *cpu
)
{
if ( _States_Is_dormant( the_thread->current_state ) ) {
-
- the_thread->Start.entry_point = (Thread_Entry) entry_point;
-
- the_thread->Start.prototype = the_prototype;
- the_thread->Start.pointer_argument = pointer_argument;
- the_thread->Start.numeric_argument = numeric_argument;
-
+ the_thread->Start.Entry = *entry;
_Thread_Load_environment( the_thread );
if ( cpu == NULL ) {
diff --git a/testsuites/samples/minimum/init.c b/testsuites/samples/minimum/init.c
index 0823a73940..65efad2b5d 100644
--- a/testsuites/samples/minimum/init.c
+++ b/testsuites/samples/minimum/init.c
@@ -20,18 +20,15 @@
#include <bsp.h>
#include <rtems/score/thread.h>
-/* forward declarations to avoid warnings */
-rtems_task Init(rtems_task_argument argument);
-
-rtems_task Init(
- rtems_task_argument ignored
-)
+static void *Init( uintptr_t ignored )
{
/* initialize application */
/* Real application would call idle loop functionality */
/* but in this case, just return and fall into a fatal error */
+
+ return NULL;
}
/* configuration information */
@@ -98,7 +95,7 @@ rtems_task Init(
* In this application, the initialization task performs the system
* initialization and then transforms itself into the idle task.
*/
-#define CONFIGURE_IDLE_TASK_BODY (Thread_Entry_numeric) Init
+#define CONFIGURE_IDLE_TASK_BODY Init
#define CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION
/*
diff --git a/testsuites/sptests/sp54/init.c b/testsuites/sptests/sp54/init.c
index 97dffa239f..3b0d4589a9 100644
--- a/testsuites/sptests/sp54/init.c
+++ b/testsuites/sptests/sp54/init.c
@@ -22,12 +22,7 @@
const char rtems_test_name[] = "SP 54";
-/* forward declarations to avoid warnings */
-rtems_task Init(rtems_task_argument argument);
-
-rtems_task Init(
- rtems_task_argument ignored
-)
+static void *Init( uintptr_t ignored )
{
rtems_status_code status;
rtems_task_priority pri;
@@ -68,7 +63,7 @@ rtems_task Init(
* In this application, the initialization task performs the system
* initialization and then transforms itself into the idle task.
*/
-#define CONFIGURE_IDLE_TASK_BODY (Thread_Entry_numeric) Init
+#define CONFIGURE_IDLE_TASK_BODY Init
#define CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION
/*
diff --git a/testsuites/sptests/spintrcritical_support/intrcritical.c b/testsuites/sptests/spintrcritical_support/intrcritical.c
index 7cea9adeb8..b831cf148f 100644
--- a/testsuites/sptests/spintrcritical_support/intrcritical.c
+++ b/testsuites/sptests/spintrcritical_support/intrcritical.c
@@ -175,8 +175,8 @@ bool interrupt_critical_section_test_support_delay(void)
static bool is_idle( const Thread_Control *thread )
{
- return thread->Start.entry_point
- == (Thread_Entry) rtems_configuration_get_idle_task();
+ return thread->Start.Entry.Kinds.Idle.entry
+ == rtems_configuration_get_idle_task();
}
static void thread_switch( Thread_Control *executing, Thread_Control *heir )