[PATCH 3/4] score: Add optional _CPU_Get_thread_executing()
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri Nov 4 13:08:22 UTC 2016
---
cpukit/score/cpu/no_cpu/rtems/score/cpuimpl.h | 12 ++++++++++++
cpukit/score/include/rtems/score/percpu.h | 18 +++++++++++++-----
cpukit/score/src/threadhandler.c | 3 ++-
3 files changed, 27 insertions(+), 6 deletions(-)
diff --git a/cpukit/score/cpu/no_cpu/rtems/score/cpuimpl.h b/cpukit/score/cpu/no_cpu/rtems/score/cpuimpl.h
index 6b8b601..7c7f71a 100644
--- a/cpukit/score/cpu/no_cpu/rtems/score/cpuimpl.h
+++ b/cpukit/score/cpu/no_cpu/rtems/score/cpuimpl.h
@@ -5,6 +5,8 @@
*/
/*
+ * Copyright (c) 2016 embedded brains GmbH.
+ *
* 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.
@@ -21,6 +23,16 @@
extern "C" {
#endif
+/**
+ * @brief Optional method to get the executing thread.
+ *
+ * This is optional. Not every CPU port needs this. It is only an optional
+ * optimization variant. In case this macro is undefined, the default
+ * implementation using the per-CPU information and the current processor index
+ * will be used to get the executing thread.
+ */
+#define _CPU_Get_thread_executing() ( _CPU_Per_CPU_current->executing )
+
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h
index 1ccbc3b..490a223 100644
--- a/cpukit/score/include/rtems/score/percpu.h
+++ b/cpukit/score/include/rtems/score/percpu.h
@@ -17,7 +17,7 @@
#ifndef _RTEMS_PERCPU_H
#define _RTEMS_PERCPU_H
-#include <rtems/score/cpu.h>
+#include <rtems/score/cpuimpl.h>
#if defined( ASM )
#include <rtems/asm.h>
@@ -687,8 +687,15 @@ bool _Per_CPU_State_wait_for_non_initial_state(
_Per_CPU_Get()->thread_dispatch_disable_level
#define _Thread_Heir \
_Per_CPU_Get()->heir
+
+#if defined(_CPU_Get_thread_executing)
+#define _Thread_Executing \
+ _CPU_Get_thread_executing()
+#else
#define _Thread_Executing \
_Per_CPU_Get_executing( _Per_CPU_Get() )
+#endif
+
#define _ISR_Nest_level \
_Per_CPU_Get()->isr_nest_level
#define _CPU_Interrupt_stack_low \
@@ -701,9 +708,10 @@ bool _Per_CPU_State_wait_for_non_initial_state(
/**
* @brief Returns the thread control block of the executing thread.
*
- * This function can be called in any context. On SMP configurations
+ * This function can be called in any thread context. On SMP configurations,
* interrupts are disabled to ensure that the processor index is used
- * consistently.
+ * consistently if no CPU port specific method is available to get the
+ * executing thread.
*
* @return The thread control block of the executing thread.
*/
@@ -711,7 +719,7 @@ RTEMS_INLINE_ROUTINE struct _Thread_Control *_Thread_Get_executing( void )
{
struct _Thread_Control *executing;
- #if defined( RTEMS_SMP )
+ #if defined(RTEMS_SMP) && !defined(_CPU_Get_thread_executing)
ISR_Level level;
_ISR_Local_disable( level );
@@ -719,7 +727,7 @@ RTEMS_INLINE_ROUTINE struct _Thread_Control *_Thread_Get_executing( void )
executing = _Thread_Executing;
- #if defined( RTEMS_SMP )
+ #if defined(RTEMS_SMP) && !defined(_CPU_Get_thread_executing)
_ISR_Local_enable( level );
#endif
diff --git a/cpukit/score/src/threadhandler.c b/cpukit/score/src/threadhandler.c
index 5d33f43..397e0cf 100644
--- a/cpukit/score/src/threadhandler.c
+++ b/cpukit/score/src/threadhandler.c
@@ -26,7 +26,7 @@
void _Thread_Handler( void )
{
- Thread_Control *executing = _Thread_Executing;
+ Thread_Control *executing;
ISR_Level level;
Per_CPU_Control *cpu_self;
@@ -36,6 +36,7 @@ void _Thread_Handler( void )
* hook point where the port gets a shot at doing whatever it requires.
*/
_Context_Initialization_at_thread_begin();
+ executing = _Thread_Executing;
/* On SMP we enter _Thread_Handler() with interrupts disabled */
_SMP_Assert( _ISR_Get_level() != 0 );
--
1.8.4.5
More information about the devel
mailing list