From ba0e9631a0e0a74a9c3d823d3d1bb60900da4891 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 10 Aug 2018 07:34:03 +0200 Subject: 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) --- cpukit/score/src/threaddispatch.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'cpukit/score/src/threaddispatch.c') diff --git a/cpukit/score/src/threaddispatch.c b/cpukit/score/src/threaddispatch.c index 9cd1e294ed..d6207bc898 100644 --- a/cpukit/score/src/threaddispatch.c +++ b/cpukit/score/src/threaddispatch.c @@ -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; + } +} -- cgit v1.2.3