mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-21 10:50:20 +08:00
score: Do not inline _Thread_Dispatch_enable()
This function is slighly too complex for inlining with two if statements. The caller already needs a stack frame due to the potential call to _Thread_Do_dispatch(). In _Thread_Dispatch_enable() the call to _Thread_Do_dispatch() can be optimized to a tail call. A text size comparision (text size after patch - text size before patch) / text size before patch on sparc/erc32 with SMP enabled showed these results: Minimum -0.000697892 (fsdosfsname01.exe) Median -0.00745021 (psxtimes01.exe) Maximum -0.0233032 (spscheduler01.exe) A text size comparision text size after patch - text size before patch on sparc/erc32 with SMP enabled showed these results: Minimum -3312 (ada_sp09.exe) Median -1024 (tm15.exe) Maximum -592 (spglobalcon01.exe)
This commit is contained in:
@@ -205,36 +205,11 @@ RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Dispatch_disable( void )
|
||||
/**
|
||||
* @brief Enables thread dispatching.
|
||||
*
|
||||
* May perfrom a thread dispatch if necessary as a side-effect.
|
||||
* May perform a thread dispatch if necessary as a side-effect.
|
||||
*
|
||||
* @param[in] cpu_self The current processor.
|
||||
*/
|
||||
RTEMS_INLINE_ROUTINE void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self )
|
||||
{
|
||||
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
|
||||
|
||||
if ( disable_level == 1 ) {
|
||||
ISR_Level level;
|
||||
|
||||
_ISR_Local_disable( level );
|
||||
|
||||
if (
|
||||
cpu_self->dispatch_necessary
|
||||
#if defined(RTEMS_SCORE_ROBUST_THREAD_DISPATCH)
|
||||
|| !_ISR_Is_enabled( level )
|
||||
#endif
|
||||
) {
|
||||
_Thread_Do_dispatch( cpu_self, level );
|
||||
} else {
|
||||
cpu_self->thread_dispatch_disable_level = 0;
|
||||
_Profiling_Thread_dispatch_enable( cpu_self, 0 );
|
||||
_ISR_Local_enable( level );
|
||||
}
|
||||
} else {
|
||||
_Assert( disable_level > 0 );
|
||||
cpu_self->thread_dispatch_disable_level = disable_level - 1;
|
||||
}
|
||||
}
|
||||
void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self );
|
||||
|
||||
/**
|
||||
* @brief Unnests thread dispatching.
|
||||
|
||||
@@ -267,3 +267,30 @@ void _Thread_Dispatch_direct( Per_CPU_Control *cpu_self )
|
||||
_ISR_Local_disable( level );
|
||||
_Thread_Do_dispatch( cpu_self, level );
|
||||
}
|
||||
|
||||
void _Thread_Dispatch_enable( Per_CPU_Control *cpu_self )
|
||||
{
|
||||
uint32_t disable_level = cpu_self->thread_dispatch_disable_level;
|
||||
|
||||
if ( disable_level == 1 ) {
|
||||
ISR_Level level;
|
||||
|
||||
_ISR_Local_disable( level );
|
||||
|
||||
if (
|
||||
cpu_self->dispatch_necessary
|
||||
#if defined(RTEMS_SCORE_ROBUST_THREAD_DISPATCH)
|
||||
|| !_ISR_Is_enabled( level )
|
||||
#endif
|
||||
) {
|
||||
_Thread_Do_dispatch( cpu_self, level );
|
||||
} else {
|
||||
cpu_self->thread_dispatch_disable_level = 0;
|
||||
_Profiling_Thread_dispatch_enable( cpu_self, 0 );
|
||||
_ISR_Local_enable( level );
|
||||
}
|
||||
} else {
|
||||
_Assert( disable_level > 0 );
|
||||
cpu_self->thread_dispatch_disable_level = disable_level - 1;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user