From 5bb93f22fc685125fa801592c90e7c96b23cd9ef Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 31 Aug 2020 17:07:19 +0200 Subject: score: Fix debug assert Do not access executing->current_state outside the protection of the thread state lock. Add missing state with a comment. --- cpukit/score/src/threadrestart.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c index 4e892f75f1..8654f571e2 100644 --- a/cpukit/score/src/threadrestart.c +++ b/cpukit/score/src/threadrestart.c @@ -336,6 +336,18 @@ void _Thread_Life_action_handler( _Thread_State_acquire( executing, lock_context ); + /* + * The executing thread runs with thread dispatching disabled right now. + * Other threads may have suspended the executing thread. The thread life + * handler may run in parallel with _Thread_Add_life_change_request() which + * may have set STATES_LIFE_IS_CHANGING. + */ + _Assert( + executing->current_state == STATES_READY + || executing->current_state == STATES_SUSPENDED + || executing->current_state == STATES_LIFE_IS_CHANGING + ); + _Thread_Change_life_locked( executing, THREAD_LIFE_PROTECTED | THREAD_LIFE_RESTARTING, @@ -348,10 +360,6 @@ void _Thread_Life_action_handler( _Assert( _Watchdog_Get_state( &executing->Timer.Watchdog ) == WATCHDOG_INACTIVE ); - _Assert( - executing->current_state == STATES_READY - || executing->current_state == STATES_SUSPENDED - ); _User_extensions_Destroy_iterators( executing ); _Thread_Load_environment( executing ); -- cgit v1.2.3