diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-05-21 16:52:54 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-05-26 13:40:24 +0200 |
commit | de694b753ca11136adce7600d55642695c8ef39d (patch) | |
tree | c275d22c99ee676e8b150dbbb17ab2661078cb17 | |
parent | score: Fix _Thread_Cancel() (diff) | |
download | rtems-de694b753ca11136adce7600d55642695c8ef39d.tar.bz2 |
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.
-rw-r--r-- | cpukit/score/src/threadrestart.c | 16 |
1 files 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; } |