summaryrefslogtreecommitdiffstats
path: root/cpukit/rtems/src/semdelete.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-20 14:59:30 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-05-20 16:17:00 +0200
commit62c528e633758302f30aa714838b51613f03f9e7 (patch)
treedda69197e96e7cb301e8a71556821437439b76b1 /cpukit/rtems/src/semdelete.c
parentrtems: _Message_queue_Get_interrupt_disable() (diff)
downloadrtems-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.c198
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;
}