forked from Imagelibrary/rtems
rtems: Simplify rtems_semaphore_delete()
This commit is contained in:
@@ -74,6 +74,11 @@ typedef struct {
|
||||
* Semaphore instance.
|
||||
*/
|
||||
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.
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -23,6 +23,11 @@
|
||||
#include <rtems/rtems/optionsimpl.h>
|
||||
#include <rtems/rtems/statusimpl.h>
|
||||
|
||||
THREAD_QUEUE_OBJECT_ASSERT(
|
||||
Semaphore_Control,
|
||||
Core_control.Wait_queue
|
||||
);
|
||||
|
||||
THREAD_QUEUE_OBJECT_ASSERT(
|
||||
Semaphore_Control,
|
||||
Core_control.mutex.Wait_queue
|
||||
|
||||
Reference in New Issue
Block a user