[PATCH 04/12] rtems: Simplify rtems_semaphore_delete()

Sebastian Huber sebastian.huber at embedded-brains.de
Fri May 27 13:50:33 UTC 2016


---
 cpukit/rtems/include/rtems/rtems/sem.h |  5 ++++
 cpukit/rtems/src/semdelete.c           | 46 +++++++++++++---------------------
 cpukit/rtems/src/semobtain.c           |  5 ++++
 3 files changed, 28 insertions(+), 28 deletions(-)

diff --git a/cpukit/rtems/include/rtems/rtems/sem.h b/cpukit/rtems/include/rtems/rtems/sem.h
index b3950a2..2c99f57 100644
--- a/cpukit/rtems/include/rtems/rtems/sem.h
+++ b/cpukit/rtems/include/rtems/rtems/sem.h
@@ -75,6 +75,11 @@ typedef struct {
    */
   union {
     /**
+     * @brief The thread queue present in all other variants.
+     */
+    Thread_queue_Control Wait_queue;
+
+    /**
      *  This is the SuperCore Mutex instance associated with this Classic
      *  API Semaphore instance.
      */
diff --git a/cpukit/rtems/src/semdelete.c b/cpukit/rtems/src/semdelete.c
index 13f2bf0..16889cd 100644
--- a/cpukit/rtems/src/semdelete.c
+++ b/cpukit/rtems/src/semdelete.c
@@ -29,6 +29,7 @@ rtems_status_code rtems_semaphore_delete(
   Semaphore_Control    *the_semaphore;
   Thread_queue_Context  queue_context;
   rtems_attribute       attribute_set;
+  Status_Control        status;
 
   _Objects_Allocator_lock();
   the_semaphore = _Semaphore_Get( id, &queue_context );
@@ -47,47 +48,36 @@ rtems_status_code rtems_semaphore_delete(
 
   attribute_set = the_semaphore->attribute_set;
 
+  _Thread_queue_Acquire_critical(
+    &the_semaphore->Core_control.Wait_queue,
+    &queue_context.Lock_context
+  );
+
 #if defined(RTEMS_SMP)
   if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) {
-    Status_Control status;
-
-    _MRSP_Acquire_critical(
-      &the_semaphore->Core_control.mrsp,
-      &queue_context
-    );
     status = _MRSP_Can_destroy( &the_semaphore->Core_control.mrsp );
-    if ( status != STATUS_SUCCESSFUL ) {
-      _MRSP_Release(
-        &the_semaphore->Core_control.mrsp,
-        &queue_context
-      );
-      _Objects_Allocator_unlock();
-      return _Status_Get( status );
-    }
   } else
 #endif
   if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) {
-    _CORE_mutex_Acquire_critical(
-      &the_semaphore->Core_control.mutex,
-      &queue_context
-    );
-
     if (
       _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex )
         && !_Attributes_Is_simple_binary_semaphore( attribute_set )
     ) {
-      _CORE_mutex_Release(
-        &the_semaphore->Core_control.mutex,
-        &queue_context
-      );
-      _Objects_Allocator_unlock();
-      return RTEMS_RESOURCE_IN_USE;
+      status = STATUS_RESOURCE_IN_USE;
+    } else {
+      status = STATUS_SUCCESSFUL;
     }
   } else {
-    _CORE_semaphore_Acquire_critical(
-      &the_semaphore->Core_control.semaphore,
-      &queue_context
+    status = STATUS_SUCCESSFUL;
+  }
+
+  if ( status != STATUS_SUCCESSFUL ) {
+    _Thread_queue_Release(
+      &the_semaphore->Core_control.Wait_queue,
+      &queue_context.Lock_context
     );
+    _Objects_Allocator_unlock();
+    return _Status_Get( status );
   }
 
   _Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
diff --git a/cpukit/rtems/src/semobtain.c b/cpukit/rtems/src/semobtain.c
index 1a73120..8cb195c 100644
--- a/cpukit/rtems/src/semobtain.c
+++ b/cpukit/rtems/src/semobtain.c
@@ -25,6 +25,11 @@
 
 THREAD_QUEUE_OBJECT_ASSERT(
   Semaphore_Control,
+  Core_control.Wait_queue
+);
+
+THREAD_QUEUE_OBJECT_ASSERT(
+  Semaphore_Control,
   Core_control.mutex.Wait_queue
 );
 
-- 
1.8.4.5



More information about the devel mailing list