Update #2555. --- cpukit/rtems/src/taskdelete.c | 76 +++++++++++++++++-------------------------- cpukit/rtems/src/tasks.c | 24 ++++++++++++-- 2 files changed, 52 insertions(+), 48 deletions(-)
diff --git a/cpukit/rtems/src/taskdelete.c b/cpukit/rtems/src/taskdelete.c index 2e8381c..4f03cbd 100644 --- a/cpukit/rtems/src/taskdelete.c +++ b/cpukit/rtems/src/taskdelete.c @@ -19,64 +19,48 @@ #endif #include <rtems/rtems/tasksimpl.h> -#include <rtems/score/apimutex.h> #include <rtems/score/threadimpl.h> -#include <rtems/config.h> rtems_status_code rtems_task_delete( rtems_id id ) { - Thread_Control *the_thread; - Thread_Control *executing; - Objects_Locations location; + Thread_Control *the_thread; + ISR_lock_Context lock_context; + Thread_Control *executing; + Per_CPU_Control *cpu_self; - the_thread = _Thread_Get( id, &location ); - switch ( location ) { - - case OBJECTS_LOCAL: - #if defined(RTEMS_MULTIPROCESSING) - if ( the_thread->is_global ) { - _Objects_MP_Close( - &_RTEMS_tasks_Information.Objects, - the_thread->Object.id - ); - _RTEMS_tasks_MP_Send_process_packet( - RTEMS_TASKS_MP_ANNOUNCE_DELETE, - the_thread->Object.id, - 0 /* Not used */ - ); - } - #endif - - executing = _Thread_Executing; - - if ( the_thread == executing ) { - /* - * 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 - ); - } else { - _Thread_Close( the_thread, executing ); - } - - _Objects_Put( &the_thread->Object ); - return RTEMS_SUCCESSFUL; + the_thread = _Thread_Get_interrupt_disable( id, &lock_context ); + if ( the_thread == NULL ) { #if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: - _Thread_Dispatch(); + if ( _Thread_MP_Is_remote( id ) ) { return RTEMS_ILLEGAL_ON_REMOTE_OBJECT; + } #endif - case OBJECTS_ERROR: - break; + return RTEMS_INVALID_ID; + } + + cpu_self = _Thread_Dispatch_disable_critical( &lock_context ); + _ISR_lock_ISR_enable( &lock_context ); + + executing = _Per_CPU_Get_executing( cpu_self ); + + if ( the_thread == executing ) { + /* + * 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 + ); + } else { + _Thread_Close( the_thread, executing ); } - return RTEMS_INVALID_ID; + _Thread_Dispatch_enable( cpu_self ); + return RTEMS_SUCCESSFUL; } diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c index b4ebff6..9f7a5d1 100644 --- a/cpukit/rtems/src/tasks.c +++ b/cpukit/rtems/src/tasks.c @@ -40,10 +40,30 @@ static void _RTEMS_tasks_Start_extension( _Event_Initialize( &api->System_event ); } +#if defined(RTEMS_MULTIPROCESSING) +static void _RTEMS_tasks_Terminate_extension( Thread_Control *executing ) +{ + if ( executing->is_global ) { + _Objects_MP_Close( + &_RTEMS_tasks_Information.Objects, + executing->Object.id + ); + _RTEMS_tasks_MP_Send_process_packet( + RTEMS_TASKS_MP_ANNOUNCE_DELETE, + executing->Object.id, + 0 /* Not used */ + ); + } +} +#endif + User_extensions_Control _RTEMS_tasks_User_extensions = { .Callouts = { - .thread_start = _RTEMS_tasks_Start_extension, - .thread_restart = _RTEMS_tasks_Start_extension +#if defined(RTEMS_MULTIPROCESSING) + .thread_terminate = _RTEMS_tasks_Terminate_extension, +#endif + .thread_start = _RTEMS_tasks_Start_extension, + .thread_restart = _RTEMS_tasks_Start_extension } }; -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel