diff options
-rw-r--r-- | cpukit/include/rtems/score/threadimpl.h | 13 | ||||
-rw-r--r-- | cpukit/posix/src/cancel.c | 12 | ||||
-rw-r--r-- | cpukit/posix/src/pthreadexit.c | 11 | ||||
-rw-r--r-- | cpukit/rtems/src/taskdelete.c | 12 | ||||
-rw-r--r-- | cpukit/rtems/src/taskexit.c | 15 | ||||
-rw-r--r-- | cpukit/score/src/threadrestart.c | 18 |
6 files changed, 28 insertions, 53 deletions
diff --git a/cpukit/include/rtems/score/threadimpl.h b/cpukit/include/rtems/score/threadimpl.h index 1a5e391677..ecc8eee058 100644 --- a/cpukit/include/rtems/score/threadimpl.h +++ b/cpukit/include/rtems/score/threadimpl.h @@ -339,14 +339,13 @@ void _Thread_Kill_zombies( void ); /** * @brief Exits the currently executing thread. * - * @param[in, out] executing The currently executing thread. - * @param life_states_to_set The states to set. - * @param[out] exit_value Contains the exit value of the thread. + * @param exit_value is the exit value of the thread. + * + * @param life_states_to_set are the thread life states to set. */ -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 ); /** diff --git a/cpukit/posix/src/cancel.c b/cpukit/posix/src/cancel.c index 4756f10389..f2636e6a97 100644 --- a/cpukit/posix/src/cancel.c +++ b/cpukit/posix/src/cancel.c @@ -52,17 +52,17 @@ int pthread_cancel( pthread_t thread ) return ESRCH; } - cpu_self = _Thread_Dispatch_disable_critical( &lock_context ); - _ISR_lock_ISR_enable( &lock_context ); - + cpu_self = _Per_CPU_Get(); executing = _Per_CPU_Get_executing( cpu_self ); if ( the_thread == executing ) { - _Thread_Exit( executing, THREAD_LIFE_TERMINATING, PTHREAD_CANCELED ); + _ISR_lock_ISR_enable( &lock_context ); + _Thread_Exit( PTHREAD_CANCELED, THREAD_LIFE_TERMINATING ); } else { + _Thread_Dispatch_disable_with_CPU( cpu_self, &lock_context ); + _ISR_lock_ISR_enable( &lock_context ); _Thread_Cancel( the_thread, executing, PTHREAD_CANCELED ); + _Thread_Dispatch_enable( cpu_self ); } - - _Thread_Dispatch_enable( cpu_self ); return 0; } diff --git a/cpukit/posix/src/pthreadexit.c b/cpukit/posix/src/pthreadexit.c index 657497010b..d5b53bb45f 100644 --- a/cpukit/posix/src/pthreadexit.c +++ b/cpukit/posix/src/pthreadexit.c @@ -27,14 +27,5 @@ void pthread_exit( void *value_ptr ) { - Thread_Control *executing; - Per_CPU_Control *cpu_self; - - cpu_self = _Thread_Dispatch_disable(); - executing = _Per_CPU_Get_executing( cpu_self ); - - _Thread_Exit( executing, THREAD_LIFE_TERMINATING, value_ptr ); - - _Thread_Dispatch_direct_no_return( cpu_self ); - RTEMS_UNREACHABLE(); + _Thread_Exit( value_ptr, THREAD_LIFE_TERMINATING ); } diff --git a/cpukit/rtems/src/taskdelete.c b/cpukit/rtems/src/taskdelete.c index 0a8d59a3a8..05321934ff 100644 --- a/cpukit/rtems/src/taskdelete.c +++ b/cpukit/rtems/src/taskdelete.c @@ -55,23 +55,13 @@ rtems_status_code rtems_task_delete( executing = _Per_CPU_Get_executing( cpu_self ); if ( the_thread == executing ) { - _Thread_Dispatch_disable_with_CPU( - cpu_self, - &context.Base.Lock_context.Lock_context - ); _ISR_lock_ISR_enable( &context.Base.Lock_context.Lock_context ); /* * The Classic tasks are neither detached nor joinable. In case of * self deletion, they are detached, otherwise joinable by default. */ - _Thread_Exit( - executing, - THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED, - NULL - ); - _Thread_Dispatch_direct_no_return( cpu_self ); - RTEMS_UNREACHABLE(); + _Thread_Exit( NULL, THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED ); } else { _Thread_Close( the_thread, executing, &context ); } diff --git a/cpukit/rtems/src/taskexit.c b/cpukit/rtems/src/taskexit.c index 4c8420d255..178e668581 100644 --- a/cpukit/rtems/src/taskexit.c +++ b/cpukit/rtems/src/taskexit.c @@ -30,18 +30,5 @@ void rtems_task_exit( void ) { - Thread_Control *executing; - Per_CPU_Control *cpu_self; - - cpu_self = _Thread_Dispatch_disable(); - executing = _Per_CPU_Get_executing( cpu_self ); - - _Thread_Exit( - executing, - THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED, - NULL - ); - - _Thread_Dispatch_direct_no_return( cpu_self ); - RTEMS_UNREACHABLE(); + _Thread_Exit( NULL, THREAD_LIFE_TERMINATING | THREAD_LIFE_DETACHED ); } 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( |