File indexing completed on 2025-05-11 08:24:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 #ifdef HAVE_CONFIG_H
0039 #include "config.h"
0040 #endif
0041
0042 #include <rtems/rtems/semimpl.h>
0043 #include <rtems/rtems/statusimpl.h>
0044
0045 rtems_status_code rtems_semaphore_delete(
0046 rtems_id id
0047 )
0048 {
0049 Semaphore_Control *the_semaphore;
0050 Thread_queue_Context queue_context;
0051 uintptr_t flags;
0052 Semaphore_Variant variant;
0053 Status_Control status;
0054
0055 _Objects_Allocator_lock();
0056 the_semaphore = _Semaphore_Get( id, &queue_context );
0057
0058 if ( the_semaphore == NULL ) {
0059 _Objects_Allocator_unlock();
0060
0061 #if defined(RTEMS_MULTIPROCESSING)
0062 if ( _Semaphore_MP_Is_remote( id ) ) {
0063 return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
0064 }
0065 #endif
0066
0067 return RTEMS_INVALID_ID;
0068 }
0069
0070 _Thread_queue_Acquire_critical(
0071 &the_semaphore->Core_control.Wait_queue,
0072 &queue_context
0073 );
0074 flags = _Semaphore_Get_flags( the_semaphore );
0075 variant = _Semaphore_Get_variant( flags );
0076
0077 switch ( variant ) {
0078 case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY:
0079 case SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING:
0080 case SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL:
0081 if (
0082 _CORE_mutex_Is_locked(
0083 &the_semaphore->Core_control.Mutex.Recursive.Mutex
0084 )
0085 ) {
0086 status = STATUS_RESOURCE_IN_USE;
0087 } else {
0088 status = STATUS_SUCCESSFUL;
0089 }
0090
0091 break;
0092 #if defined(RTEMS_SMP)
0093 case SEMAPHORE_VARIANT_MRSP:
0094 status = _MRSP_Can_destroy( &the_semaphore->Core_control.MRSP );
0095 break;
0096 #endif
0097 default:
0098 _Assert(
0099 variant == SEMAPHORE_VARIANT_SIMPLE_BINARY
0100 || variant == SEMAPHORE_VARIANT_COUNTING
0101 );
0102 status = STATUS_SUCCESSFUL;
0103 break;
0104 }
0105
0106 if ( status != STATUS_SUCCESSFUL ) {
0107 _Thread_queue_Release(
0108 &the_semaphore->Core_control.Wait_queue,
0109 &queue_context
0110 );
0111 _Objects_Allocator_unlock();
0112 return _Status_Get( status );
0113 }
0114
0115 _Objects_Close( &_Semaphore_Information, &the_semaphore->Object );
0116
0117 switch ( variant ) {
0118 #if defined(RTEMS_SMP)
0119 case SEMAPHORE_VARIANT_MRSP:
0120 _MRSP_Destroy( &the_semaphore->Core_control.MRSP, &queue_context );
0121 break;
0122 #endif
0123 default:
0124 _Assert(
0125 variant == SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY
0126 || variant == SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING
0127 || variant == SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL
0128 || variant == SEMAPHORE_VARIANT_SIMPLE_BINARY
0129 || variant == SEMAPHORE_VARIANT_COUNTING
0130 );
0131 _Thread_queue_Flush_critical(
0132 &the_semaphore->Core_control.Wait_queue.Queue,
0133 _Semaphore_Get_operations( flags ),
0134 _Thread_queue_Flush_status_object_was_deleted,
0135 &queue_context
0136 );
0137 _Thread_queue_Destroy( &the_semaphore->Core_control.Wait_queue );
0138 break;
0139 }
0140
0141 #if defined(RTEMS_MULTIPROCESSING)
0142 if ( _Semaphore_Is_global( flags ) ) {
0143
0144 _Objects_MP_Close( &_Semaphore_Information, id );
0145
0146 _Semaphore_MP_Send_process_packet(
0147 SEMAPHORE_MP_ANNOUNCE_DELETE,
0148 id,
0149 0,
0150 0
0151 );
0152 }
0153 #endif
0154
0155 _Semaphore_Free( the_semaphore );
0156 _Objects_Allocator_unlock();
0157 return RTEMS_SUCCESSFUL;
0158 }