diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-12-07 11:48:36 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-12-11 09:05:07 +0100 |
commit | 01f8c12ee57230fca1581e1b5be91f3decba0488 (patch) | |
tree | 279ef8193d107ea59490e3fdeb18d20639c54f36 /cpukit/rtems/src/semdelete.c | |
parent | score: Optimize _TLS_Get_size() (diff) | |
download | rtems-01f8c12ee57230fca1581e1b5be91f3decba0488.tar.bz2 |
rtems: Optimize semaphore control block
Move variant, discipline, and global information to flags stored in a
node pointer of active semaphores.
Update #3833.
Diffstat (limited to 'cpukit/rtems/src/semdelete.c')
-rw-r--r-- | cpukit/rtems/src/semdelete.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/cpukit/rtems/src/semdelete.c b/cpukit/rtems/src/semdelete.c index a9fb863814..44fec02b81 100644 --- a/cpukit/rtems/src/semdelete.c +++ b/cpukit/rtems/src/semdelete.c @@ -27,6 +27,8 @@ rtems_status_code rtems_semaphore_delete( { Semaphore_Control *the_semaphore; Thread_queue_Context queue_context; + uintptr_t flags; + Semaphore_Variant variant; Status_Control status; _Objects_Allocator_lock(); @@ -48,8 +50,10 @@ rtems_status_code rtems_semaphore_delete( &the_semaphore->Core_control.Wait_queue, &queue_context ); + flags = _Semaphore_Get_flags( the_semaphore ); + variant = _Semaphore_Get_variant( flags ); - switch ( the_semaphore->variant ) { + switch ( variant ) { case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY: case SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING: case SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL: @@ -71,8 +75,8 @@ rtems_status_code rtems_semaphore_delete( #endif default: _Assert( - the_semaphore->variant == SEMAPHORE_VARIANT_SIMPLE_BINARY - || the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING + variant == SEMAPHORE_VARIANT_SIMPLE_BINARY + || variant == SEMAPHORE_VARIANT_COUNTING ); status = STATUS_SUCCESSFUL; break; @@ -89,7 +93,7 @@ rtems_status_code rtems_semaphore_delete( _Objects_Close( &_Semaphore_Information, &the_semaphore->Object ); - switch ( the_semaphore->variant ) { + switch ( variant ) { #if defined(RTEMS_SMP) case SEMAPHORE_VARIANT_MRSP: _MRSP_Destroy( &the_semaphore->Core_control.MRSP, &queue_context ); @@ -97,15 +101,15 @@ rtems_status_code rtems_semaphore_delete( #endif default: _Assert( - the_semaphore->variant == SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY - || the_semaphore->variant == SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING - || the_semaphore->variant == SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL - || the_semaphore->variant == SEMAPHORE_VARIANT_SIMPLE_BINARY - || the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING + variant == SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY + || variant == SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING + || variant == SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL + || variant == SEMAPHORE_VARIANT_SIMPLE_BINARY + || variant == SEMAPHORE_VARIANT_COUNTING ); _Thread_queue_Flush_critical( &the_semaphore->Core_control.Wait_queue.Queue, - _Semaphore_Get_operations( the_semaphore ), + _Semaphore_Get_operations( flags ), _Thread_queue_Flush_status_object_was_deleted, &queue_context ); @@ -114,7 +118,7 @@ rtems_status_code rtems_semaphore_delete( } #if defined(RTEMS_MULTIPROCESSING) - if ( the_semaphore->is_global ) { + if ( _Semaphore_Is_global( flags ) ) { _Objects_MP_Close( &_Semaphore_Information, id ); |