From 3ca6e6185131ab804b2831ab308b44b4b174856a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 25 May 2016 16:49:53 +0200 Subject: rtems: Simplify rtems_semaphore_delete() --- cpukit/rtems/src/semdelete.c | 46 +++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) (limited to 'cpukit/rtems/src/semdelete.c') diff --git a/cpukit/rtems/src/semdelete.c b/cpukit/rtems/src/semdelete.c index 13f2bf0268..16889cd6b6 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 ); -- cgit v1.2.3