forked from Imagelibrary/rtems
score: Add optional _CPU_Get_thread_executing()
This commit is contained in:
@@ -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 uses the per-CPU information and the current processor index
|
||||
* to get the executing thread.
|
||||
*/
|
||||
#define _CPU_Get_thread_executing() ( _CPU_Per_CPU_current->executing )
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -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>
|
||||
@@ -681,8 +681,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 \
|
||||
@@ -695,9 +702,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.
|
||||
*/
|
||||
@@ -705,7 +713,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 );
|
||||
@@ -713,7 +721,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
|
||||
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user