diff options
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/thread.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c index 2d9fc33e6b..a181780e52 100644 --- a/cpukit/score/src/thread.c +++ b/cpukit/score/src/thread.c @@ -588,19 +588,20 @@ void _Thread_Handler( void ) executing = _Thread_Executing; - _Thread_Dispatch_disable_level = 0; - /* - * Do the 'begin' here instead of after the context switch. - * This ensures 'switch' extensions can not be called before - * 'begin' extensions. + * Take care that 'begin' extensions get to complete before + * 'switch' extensions can run. This means must keep dispatch + * disabled until all 'begin' extensions complete. */ - + _User_extensions_Task_begin( executing ); + + /* + * At this point, the dispatch disable level BETTER be 1. + */ - if ( _Thread_Is_context_switch_necessary() ) - _Thread_Dispatch(); - + _Thread_Enable_dispatch(); + (*executing->Start.entry_point)( executing->Start.initial_argument ); _User_extensions_Task_exitted( executing ); |