summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/threadrestart.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/src/threadrestart.c')
-rw-r--r--cpukit/score/src/threadrestart.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c
index c8f7f7b6b1..0ba5ca24ba 100644
--- a/cpukit/score/src/threadrestart.c
+++ b/cpukit/score/src/threadrestart.c
@@ -489,14 +489,19 @@ void _Thread_Close(
);
}
-void _Thread_Exit(
- Thread_Control *executing,
- Thread_Life_state life_states_to_set,
- void *exit_value
+RTEMS_NO_RETURN void _Thread_Exit(
+ void *exit_value,
+ Thread_Life_state life_states_to_set
)
{
+ Per_CPU_Control *cpu_self;
+ Thread_Control *executing;
ISR_lock_Context lock_context;
+ _ISR_lock_ISR_disable( &lock_context );
+ cpu_self = _Thread_Dispatch_disable_critical( &lock_context );
+ executing = _Per_CPU_Get_executing( cpu_self );
+
_Assert(
_Watchdog_Get_state( &executing->Timer.Watchdog ) == WATCHDOG_INACTIVE
);
@@ -505,7 +510,7 @@ void _Thread_Exit(
|| executing->current_state == STATES_SUSPENDED
);
- _Thread_State_acquire( executing, &lock_context );
+ _Thread_State_acquire_critical( executing, &lock_context );
_Thread_Set_exit_value( executing, exit_value );
_Thread_Change_life_locked(
executing,
@@ -514,6 +519,9 @@ void _Thread_Exit(
THREAD_LIFE_PROTECTED | THREAD_LIFE_CHANGE_DEFERRED
);
_Thread_State_release( executing, &lock_context );
+
+ _Thread_Dispatch_direct_no_return( cpu_self );
+ RTEMS_UNREACHABLE();
}
Status_Control _Thread_Restart(