[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