[PATCH 21/32] rtems: Avoid Giant lock for rtems_task_delete()
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed May 18 09:20:40 UTC 2016
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
More information about the devel
mailing list