From de694b753ca11136adce7600d55642695c8ef39d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 21 May 2021 16:52:54 +0200 Subject: score: Direct thread dispatch in a self restart Commit 73ebf9a27ed5cd0fd3e0dc0da98345d7faa610a2 accidentally removed the direct thread dispatch in a self thread restart. In case of a self restart (always in task context) the directive shall not return. If this is not possible due to a bad thread dispatch disable level, then a fatal error shall occur. Update #4412. --- cpukit/score/src/threadrestart.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c index e4e123b9f0..79a154e3d3 100644 --- a/cpukit/score/src/threadrestart.c +++ b/cpukit/score/src/threadrestart.c @@ -539,6 +539,7 @@ Status_Control _Thread_Restart( { Thread_Life_state previous; Per_CPU_Control *cpu_self; + bool is_self_restart; Thread_Life_state ignored_life_states; Thread_queue_Context queue_context; @@ -550,11 +551,10 @@ Status_Control _Thread_Restart( } cpu_self = _Thread_Dispatch_disable_critical( lock_context ); + is_self_restart = ( the_thread == _Per_CPU_Get_executing( cpu_self ) && + !_Per_CPU_Is_ISR_in_progress( cpu_self ) ); - if ( - the_thread == _Per_CPU_Get_executing( cpu_self ) && - !_Per_CPU_Is_ISR_in_progress( cpu_self ) - ) { + if ( is_self_restart ) { ignored_life_states = THREAD_LIFE_PROTECTED | THREAD_LIFE_CHANGE_DEFERRED; } else { ignored_life_states = 0; @@ -582,7 +582,13 @@ Status_Control _Thread_Restart( _Thread_Wait_release( the_thread, &queue_context ); _Thread_Priority_update( &queue_context ); - _Thread_Dispatch_enable( cpu_self ); + + if ( is_self_restart ) { + _Thread_Dispatch_direct_no_return( cpu_self ); + } else { + _Thread_Dispatch_enable( cpu_self ); + } + return STATUS_SUCCESSFUL; } -- cgit v1.2.3