Remove superfluous includes. Use one attribute compare for each semaphore variant. Text size drops by 10% on PowerPC due to this. --- cpukit/rtems/src/semcreate.c | 240 +++++++++++++++++++------------------------ 1 file changed, 108 insertions(+), 132 deletions(-)
diff --git a/cpukit/rtems/src/semcreate.c b/cpukit/rtems/src/semcreate.c index b65a442..a13c4cc 100644 --- a/cpukit/rtems/src/semcreate.c +++ b/cpukit/rtems/src/semcreate.c @@ -18,41 +18,12 @@ #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/rtems/attrimpl.h> #include <rtems/rtems/statusimpl.h> #include <rtems/rtems/tasksimpl.h> -#include <rtems/score/coremuteximpl.h> -#include <rtems/score/coresemimpl.h> -#include <rtems/score/threaddispatch.h> #include <rtems/score/sysstate.h> -#include <rtems/score/interr.h> - -/* - * rtems_semaphore_create - * - * This directive creates a semaphore and sets the initial value based - * on the given count. A semaphore id is returned. - * - * Input parameters: - * name - user defined semaphore name - * count - initial count of semaphore - * attribute_set - semaphore attributes - * priority_ceiling - semaphore's ceiling priority - * id - pointer to semaphore id - * - * Output parameters: - * id - semaphore id - * RTEMS_SUCCESSFUL - if successful - * error code - if unsuccessful - */ - rtems_status_code rtems_semaphore_create( rtems_name name, uint32_t count, @@ -64,6 +35,10 @@ rtems_status_code rtems_semaphore_create( Semaphore_Control *the_semaphore; Thread_Control *executing; Status_Control status; + rtems_attribute kind_mask; + rtems_attribute maybe_global; + rtems_attribute mutex_with_protocol; + Semaphore_Variant variant; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; @@ -72,49 +47,56 @@ rtems_status_code rtems_semaphore_create( return RTEMS_INVALID_ADDRESS; #if defined(RTEMS_MULTIPROCESSING) - if ( _Attributes_Is_global( attribute_set ) ) { - - if ( !_System_state_Is_multiprocessing ) - return RTEMS_MP_NOT_CONFIGURED; - - if ( _Attributes_Is_inherit_priority( attribute_set ) || - _Attributes_Is_priority_ceiling( attribute_set ) || - _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) - return RTEMS_NOT_DEFINED; - - } else -#endif - - if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) && - !( _Attributes_Is_binary_semaphore( attribute_set ) && - !_Attributes_Is_priority( attribute_set ) ) ) { - return RTEMS_NOT_DEFINED; + if ( + _Attributes_Is_global( attribute_set ) + && !_System_state_Is_multiprocessing + ) { + return RTEMS_MP_NOT_CONFIGURED; } +#endif - if ( _Attributes_Is_inherit_priority( attribute_set ) || - _Attributes_Is_priority_ceiling( attribute_set ) ) { + kind_mask = RTEMS_SEMAPHORE_CLASS | RTEMS_INHERIT_PRIORITY + | RTEMS_PRIORITY_CEILING | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING; - if ( ! (_Attributes_Is_binary_semaphore( attribute_set ) && - _Attributes_Is_priority( attribute_set ) ) ) - return RTEMS_NOT_DEFINED; + maybe_global = attribute_set & kind_mask; - } + mutex_with_protocol = attribute_set + & ( kind_mask | RTEMS_GLOBAL | RTEMS_PRIORITY ); - if ( !_Attributes_Has_at_most_one_protocol( attribute_set ) ) - return RTEMS_NOT_DEFINED; - - if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) ) + if ( maybe_global == RTEMS_COUNTING_SEMAPHORE ) { + variant = SEMAPHORE_VARIANT_COUNTING; + } else if ( count > 1 ) { return RTEMS_INVALID_NUMBER; - -#if !defined(RTEMS_SMP) - /* - * On uni-processor configurations the Multiprocessor Resource Sharing - * Protocol is equivalent to the Priority Ceiling Protocol. - */ - if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) { - attribute_set |= RTEMS_PRIORITY_CEILING | RTEMS_PRIORITY; - } + } else if ( maybe_global == RTEMS_SIMPLE_BINARY_SEMAPHORE ) { + variant = SEMAPHORE_VARIANT_SIMPLE_BINARY; + } else if ( maybe_global == RTEMS_BINARY_SEMAPHORE ) { + variant = SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL; + } else if ( + mutex_with_protocol + == ( RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY ) + ) { + variant = SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY; + } else if ( + mutex_with_protocol + == ( RTEMS_BINARY_SEMAPHORE | RTEMS_PRIORITY | RTEMS_PRIORITY_CEILING ) + ) { + variant = SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING; + } else if ( + mutex_with_protocol + == ( RTEMS_BINARY_SEMAPHORE | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING ) + ) { +#if defined(RTEMS_SMP) + variant = SEMAPHORE_VARIANT_MRSP; +#else + /* + * On uni-processor configurations the Multiprocessor Resource Sharing + * Protocol is equivalent to the Priority Ceiling Protocol. + */ + variant = SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING; #endif + } else { + return RTEMS_NOT_DEFINED; + } the_semaphore = _Semaphore_Allocate(); @@ -138,86 +120,80 @@ rtems_status_code rtems_semaphore_create( priority_ceiling = _RTEMS_tasks_Priority_to_Core( priority_ceiling ); executing = _Thread_Get_executing(); + the_semaphore->variant = variant; + if ( _Attributes_Is_priority( attribute_set ) ) { the_semaphore->discipline = SEMAPHORE_DISCIPLINE_PRIORITY; } else { the_semaphore->discipline = SEMAPHORE_DISCIPLINE_FIFO; } - if ( _Attributes_Is_counting_semaphore( attribute_set ) ) { - the_semaphore->variant = SEMAPHORE_VARIANT_COUNTING; - _CORE_semaphore_Initialize( - &the_semaphore->Core_control.Semaphore, - count - ); - status = STATUS_SUCCESSFUL; - } else if ( _Attributes_Is_simple_binary_semaphore( attribute_set ) ) { - the_semaphore->variant = SEMAPHORE_VARIANT_SIMPLE_BINARY; - _CORE_semaphore_Initialize( - &the_semaphore->Core_control.Semaphore, - count != 0 - ); - status = STATUS_SUCCESSFUL; -#if defined(RTEMS_SMP) - } else if ( _Attributes_Is_multiprocessor_resource_sharing( attribute_set ) ) { - the_semaphore->variant = SEMAPHORE_VARIANT_MRSP; - status = _MRSP_Initialize( - &the_semaphore->Core_control.MRSP, - priority_ceiling, - executing, - count != 1 - ); -#endif - } else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) { - _Assert( _Attributes_Is_binary_semaphore( attribute_set ) ); - the_semaphore->variant = SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING; - _CORE_ceiling_mutex_Initialize( - &the_semaphore->Core_control.Mutex, - priority_ceiling - ); - - if ( count == 0 ) { - Thread_queue_Context queue_context; - - _Thread_queue_Context_initialize( &queue_context ); - _ISR_lock_ISR_disable( &queue_context.Lock_context ); - _CORE_mutex_Acquire_critical( - &the_semaphore->Core_control.Mutex.Recursive.Mutex, - &queue_context - ); - status = _CORE_ceiling_mutex_Set_owner( - &the_semaphore->Core_control.Mutex, - executing, - &queue_context + switch ( the_semaphore->variant ) { + case SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL: + case SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY: + _CORE_recursive_mutex_Initialize( + &the_semaphore->Core_control.Mutex.Recursive ); - } else { - status = STATUS_SUCCESSFUL; - } - } else { - _Assert( _Attributes_Is_binary_semaphore( attribute_set ) ); - if ( _Attributes_Is_inherit_priority( attribute_set ) ) { - the_semaphore->variant = SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY; - } else { - the_semaphore->variant = SEMAPHORE_VARIANT_MUTEX_NO_PROTOCOL; - } + if ( count == 0 ) { + _CORE_mutex_Set_owner( + &the_semaphore->Core_control.Mutex.Recursive.Mutex, + executing + ); - _CORE_recursive_mutex_Initialize( - &the_semaphore->Core_control.Mutex.Recursive - ); + if ( variant == SEMAPHORE_VARIANT_MUTEX_INHERIT_PRIORITY ) { + ++executing->resource_count; + } + } - if ( count == 0 ) { - _CORE_mutex_Set_owner( - &the_semaphore->Core_control.Mutex.Recursive.Mutex, - executing + status = STATUS_SUCCESSFUL; + break; + case SEMAPHORE_VARIANT_MUTEX_PRIORITY_CEILING: + _CORE_ceiling_mutex_Initialize( + &the_semaphore->Core_control.Mutex, + priority_ceiling ); - if ( _Attributes_Is_inherit_priority( attribute_set ) ) { - ++executing->resource_count; + if ( count == 0 ) { + Thread_queue_Context queue_context; + + _Thread_queue_Context_initialize( &queue_context ); + _ISR_lock_ISR_disable( &queue_context.Lock_context ); + _CORE_mutex_Acquire_critical( + &the_semaphore->Core_control.Mutex.Recursive.Mutex, + &queue_context + ); + status = _CORE_ceiling_mutex_Set_owner( + &the_semaphore->Core_control.Mutex, + executing, + &queue_context + ); + } else { + status = STATUS_SUCCESSFUL; } - } - status = STATUS_SUCCESSFUL; + break; +#if defined(RTEMS_SMP) + case SEMAPHORE_VARIANT_MRSP: + status = _MRSP_Initialize( + &the_semaphore->Core_control.MRSP, + priority_ceiling, + executing, + count == 0 + ); + break; +#endif + default: + _Assert( + the_semaphore->variant == SEMAPHORE_VARIANT_SIMPLE_BINARY + || the_semaphore->variant == SEMAPHORE_VARIANT_COUNTING + ); + _CORE_semaphore_Initialize( + &the_semaphore->Core_control.Semaphore, + count + ); + status = STATUS_SUCCESSFUL; + break; } if ( status != STATUS_SUCCESSFUL ) { -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel