diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-20 14:59:30 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-05-20 16:17:00 +0200 |
commit | 62c528e633758302f30aa714838b51613f03f9e7 (patch) | |
tree | dda69197e96e7cb301e8a71556821437439b76b1 /cpukit/rtems/src/semdelete.c | |
parent | rtems: _Message_queue_Get_interrupt_disable() (diff) | |
download | rtems-62c528e633758302f30aa714838b51613f03f9e7.tar.bz2 |
rtems: _Semaphore_Get_interrupt_disable()
Use _Objects_Get_local() for _Semaphore_Get_interrupt_disable() to get
rid of the location parameter. Move remote object handling to semaphore
MPCI support.
Diffstat (limited to 'cpukit/rtems/src/semdelete.c')
-rw-r--r-- | cpukit/rtems/src/semdelete.c | 198 |
1 files changed, 90 insertions, 108 deletions
diff --git a/cpukit/rtems/src/semdelete.c b/cpukit/rtems/src/semdelete.c index eebe88afa8..38d4a0e905 100644 --- a/cpukit/rtems/src/semdelete.c +++ b/cpukit/rtems/src/semdelete.c @@ -18,135 +18,117 @@ #include "config.h" #endif -#include <rtems/system.h> -#include <rtems/rtems/status.h> -#include <rtems/rtems/support.h> -#include <rtems/rtems/attrimpl.h> -#include <rtems/score/isr.h> -#include <rtems/rtems/options.h> #include <rtems/rtems/semimpl.h> -#include <rtems/score/coremuteximpl.h> -#include <rtems/score/coresemimpl.h> -#include <rtems/score/thread.h> - -#include <rtems/score/interr.h> +#include <rtems/rtems/attrimpl.h> rtems_status_code rtems_semaphore_delete( rtems_id id ) { - Semaphore_Control *the_semaphore; - Objects_Locations location; - ISR_lock_Context lock_context; - rtems_attribute attribute_set; + Semaphore_Control *the_semaphore; + ISR_lock_Context lock_context; + rtems_attribute attribute_set; _Objects_Allocator_lock(); + the_semaphore = _Semaphore_Get_interrupt_disable( id, &lock_context ); - the_semaphore = _Semaphore_Get_interrupt_disable( - id, - &location, - &lock_context - ); - switch ( location ) { + if ( the_semaphore == NULL ) { + _Objects_Allocator_unlock(); - case OBJECTS_LOCAL: - attribute_set = the_semaphore->attribute_set; -#if defined(RTEMS_SMP) - if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) { - MRSP_Status mrsp_status; - - _MRSP_Acquire_critical( - &the_semaphore->Core_control.mrsp, - &lock_context - ); - mrsp_status = _MRSP_Can_destroy( &the_semaphore->Core_control.mrsp ); - if ( mrsp_status != MRSP_SUCCESSFUL ) { - _MRSP_Release( - &the_semaphore->Core_control.mrsp, - &lock_context - ); - _Objects_Allocator_unlock(); - return _Semaphore_Translate_MRSP_status_code( mrsp_status ); - } - } else +#if defined(RTEMS_MULTIPROCESSING) + if ( _Semaphore_MP_Is_remote( id ) ) { + return RTEMS_ILLEGAL_ON_REMOTE_OBJECT; + } #endif - if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) { - _CORE_mutex_Acquire_critical( - &the_semaphore->Core_control.mutex, - &lock_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, - &lock_context - ); - _Objects_Allocator_unlock(); - return RTEMS_RESOURCE_IN_USE; - } - } else { - _CORE_semaphore_Acquire_critical( - &the_semaphore->Core_control.semaphore, - &lock_context - ); - } - - _Objects_Close( &_Semaphore_Information, &the_semaphore->Object ); + + return RTEMS_INVALID_ID; + } + + attribute_set = the_semaphore->attribute_set; #if defined(RTEMS_SMP) - if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) { - _MRSP_Destroy( &the_semaphore->Core_control.mrsp, &lock_context ); - } else + if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) { + MRSP_Status mrsp_status; + + _MRSP_Acquire_critical( + &the_semaphore->Core_control.mrsp, + &lock_context + ); + mrsp_status = _MRSP_Can_destroy( &the_semaphore->Core_control.mrsp ); + if ( mrsp_status != MRSP_SUCCESSFUL ) { + _MRSP_Release( + &the_semaphore->Core_control.mrsp, + &lock_context + ); + _Objects_Allocator_unlock(); + return _Semaphore_Translate_MRSP_status_code( mrsp_status ); + } + } else #endif - if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) { - _CORE_mutex_Flush( - &the_semaphore->Core_control.mutex, - _CORE_mutex_Was_deleted, - _Semaphore_MP_Send_object_was_deleted, - id, - &lock_context - ); - _CORE_mutex_Destroy( &the_semaphore->Core_control.mutex ); - } else { - _CORE_semaphore_Destroy( - &the_semaphore->Core_control.semaphore, - _Semaphore_MP_Send_object_was_deleted, - id, - &lock_context - ); - } - -#if defined(RTEMS_MULTIPROCESSING) - if ( _Attributes_Is_global( attribute_set ) ) { + if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) { + _CORE_mutex_Acquire_critical( + &the_semaphore->Core_control.mutex, + &lock_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, + &lock_context + ); + _Objects_Allocator_unlock(); + return RTEMS_RESOURCE_IN_USE; + } + } else { + _CORE_semaphore_Acquire_critical( + &the_semaphore->Core_control.semaphore, + &lock_context + ); + } - _Objects_MP_Close( &_Semaphore_Information, id ); + _Objects_Close( &_Semaphore_Information, &the_semaphore->Object ); - _Semaphore_MP_Send_process_packet( - SEMAPHORE_MP_ANNOUNCE_DELETE, - id, - 0, /* Not used */ - 0 /* Not used */ - ); - } +#if defined(RTEMS_SMP) + if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) { + _MRSP_Destroy( &the_semaphore->Core_control.mrsp, &lock_context ); + } else #endif - - _Semaphore_Free( the_semaphore ); - _Objects_Allocator_unlock(); - return RTEMS_SUCCESSFUL; + if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) { + _CORE_mutex_Flush( + &the_semaphore->Core_control.mutex, + _CORE_mutex_Was_deleted, + _Semaphore_MP_Send_object_was_deleted, + id, + &lock_context + ); + _CORE_mutex_Destroy( &the_semaphore->Core_control.mutex ); + } else { + _CORE_semaphore_Destroy( + &the_semaphore->Core_control.semaphore, + _Semaphore_MP_Send_object_was_deleted, + id, + &lock_context + ); + } #if defined(RTEMS_MULTIPROCESSING) - case OBJECTS_REMOTE: - _Objects_Allocator_unlock(); - return RTEMS_ILLEGAL_ON_REMOTE_OBJECT; -#endif + if ( _Attributes_Is_global( attribute_set ) ) { - case OBJECTS_ERROR: - break; + _Objects_MP_Close( &_Semaphore_Information, id ); + + _Semaphore_MP_Send_process_packet( + SEMAPHORE_MP_ANNOUNCE_DELETE, + id, + 0, /* Not used */ + 0 /* Not used */ + ); } +#endif + _Semaphore_Free( the_semaphore ); _Objects_Allocator_unlock(); - return RTEMS_INVALID_ID; + return RTEMS_SUCCESSFUL; } |