Enable support for string objects names unconditionally. Add const qualifier throughout. Split _Objects_Namespace_remove() into _Objects_Namespace_remove_u32() and _Objects_Namespace_remove_string() to avoid an unnecessary dependency on _Workspace_Free().
Update #2514. --- cpukit/include/rtems/posix/mqueueimpl.h | 6 ++- cpukit/include/rtems/posix/semaphoreimpl.h | 6 ++- cpukit/include/rtems/score/object.h | 16 +----- cpukit/include/rtems/score/objectimpl.h | 74 +++++++++++++------------- cpukit/posix/src/key.c | 4 +- cpukit/posix/src/ptimer.c | 4 +- cpukit/posix/src/semaphoredeletesupp.c | 2 +- cpukit/score/src/objectclose.c | 6 +-- cpukit/score/src/objectgetnameasstring.c | 17 ++---- cpukit/score/src/objectidtoname.c | 6 +-- cpukit/score/src/objectinitializeinformation.c | 4 +- cpukit/score/src/objectnamespaceremove.c | 34 ++++++------ cpukit/score/src/objectnametoidstring.c | 2 - cpukit/score/src/objectsetname.c | 12 ++--- 14 files changed, 85 insertions(+), 108 deletions(-) diff --git a/cpukit/include/rtems/posix/mqueueimpl.h b/cpukit/include/rtems/posix/mqueueimpl.h index 6813a3ef88..28381ad54b 100644 --- a/cpukit/include/rtems/posix/mqueueimpl.h +++ b/cpukit/include/rtems/posix/mqueueimpl.h @@ -156,8 +156,10 @@ RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Namespace_remove ( POSIX_Message_queue_Control *the_mq ) { - _Objects_Namespace_remove( - &_POSIX_Message_queue_Information, &the_mq->Object ); + _Objects_Namespace_remove_string( + &_POSIX_Message_queue_Information, + &the_mq->Object + ); } RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control * diff --git a/cpukit/include/rtems/posix/semaphoreimpl.h b/cpukit/include/rtems/posix/semaphoreimpl.h index fd17743699..5ae6a300fa 100644 --- a/cpukit/include/rtems/posix/semaphoreimpl.h +++ b/cpukit/include/rtems/posix/semaphoreimpl.h @@ -107,8 +107,10 @@ RTEMS_INLINE_ROUTINE void _POSIX_Semaphore_Namespace_remove ( POSIX_Semaphore_Control *the_semaphore ) { - _Objects_Namespace_remove( - &_POSIX_Semaphore_Information, &the_semaphore->Object ); + _Objects_Namespace_remove_string( + &_POSIX_Semaphore_Information, + &the_semaphore->Object + ); } RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get_by_name( diff --git a/cpukit/include/rtems/score/object.h b/cpukit/include/rtems/score/object.h index 6789c61fea..adafcaa72d 100644 --- a/cpukit/include/rtems/score/object.h +++ b/cpukit/include/rtems/score/object.h @@ -36,16 +36,6 @@ extern "C" { */ /**@{*/ -#if defined(RTEMS_POSIX_API) - /** - * This macro is defined when an API is enabled that requires the - * use of strings for object names. Since the Classic API uses - * 32-bit unsigned integers and not strings, this allows us to - * disable this in the smallest RTEMS configuratinos. - */ - #define RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES -#endif - /** * @defgroup ScoreCPU CPU Architecture Support * @@ -67,10 +57,8 @@ extern "C" { * object names. */ typedef union { - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - /** This is a pointer to a string name. */ - const char *name_p; - #endif + /** This is a pointer to a string name. */ + const char *name_p; /** This is the actual 32-bit "raw" integer name. */ uint32_t name_u32; } Objects_Name; diff --git a/cpukit/include/rtems/score/objectimpl.h b/cpukit/include/rtems/score/objectimpl.h index cc5820785c..1bef14b116 100644 --- a/cpukit/include/rtems/score/objectimpl.h +++ b/cpukit/include/rtems/score/objectimpl.h @@ -130,6 +130,8 @@ typedef struct { Objects_Id maximum_id; /** This is the maximum number of objects in this class. */ Objects_Maximum maximum; + /** This is true if names are strings. */ + bool is_string; /** This is the true if unlimited objects in this class. */ bool auto_extend; /** This is the number of objects in a block. */ @@ -146,10 +148,6 @@ typedef struct { uint32_t *inactive_per_block; /** This is a table to the chain of inactive object memory blocks. */ void **object_blocks; - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - /** This is true if names are strings. */ - bool is_string; - #endif /** This is the maximum length of names. */ uint16_t name_length; #if defined(RTEMS_MULTIPROCESSING) @@ -685,22 +683,31 @@ size_t _Objects_Name_to_string( * @retval If successful, true is returned. Otherwise false is returned. */ bool _Objects_Set_name( - Objects_Information *information, - Objects_Control *the_object, - const char *name + const Objects_Information *information, + Objects_Control *the_object, + const char *name ); /** - * @brief Removes object from namespace. + * @brief Removes object with a 32-bit integer name from its namespace. * - * This function removes @a the_object from the namespace. + * @param[in] information The corresponding object information table. + * @param[in] the_object The object. + */ +void _Objects_Namespace_remove_u32( + const Objects_Information *information, + Objects_Control *the_object +); + +/** + * @brief Removes object with a string name from its namespace. * - * @param[in] information points to an Object Information Table. - * @param[in] the_object is a pointer to an object. + * @param[in] information The corresponding object information table. + * @param[in] the_object The object. */ -void _Objects_Namespace_remove( - Objects_Information *information, - Objects_Control *the_object +void _Objects_Namespace_remove_string( + const Objects_Information *information, + Objects_Control *the_object ); /** @@ -713,8 +720,8 @@ void _Objects_Namespace_remove( * @param[in] the_object is a pointer to an object */ void _Objects_Close( - Objects_Information *information, - Objects_Control *the_object + const Objects_Information *information, + Objects_Control *the_object ); /** @@ -828,9 +835,9 @@ RTEMS_INLINE_ROUTINE bool _Objects_Are_ids_equal( */ RTEMS_INLINE_ROUTINE void _Objects_Set_local_object( - Objects_Information *information, - uint32_t index, - Objects_Control *the_object + const Objects_Information *information, + uint32_t index, + Objects_Control *the_object ) { /* @@ -838,10 +845,7 @@ RTEMS_INLINE_ROUTINE void _Objects_Set_local_object( * where the Id is known to be good. Therefore, this should NOT * occur in normal situations. */ - #if defined(RTEMS_DEBUG) - if ( index > information->maximum ) - return; - #endif + _Assert( index <= information->maximum ); information->local_table[ index ] = the_object; } @@ -861,8 +865,8 @@ RTEMS_INLINE_ROUTINE void _Objects_Set_local_object( */ RTEMS_INLINE_ROUTINE void _Objects_Invalidate_Id( - Objects_Information *information, - Objects_Control *the_object + const Objects_Information *information, + Objects_Control *the_object ) { _Assert( information != NULL ); @@ -910,12 +914,12 @@ RTEMS_INLINE_ROUTINE void _Objects_Open( * @param[in] name is the name of the object to make accessible */ RTEMS_INLINE_ROUTINE void _Objects_Open_u32( - Objects_Information *information, - Objects_Control *the_object, - uint32_t name + const Objects_Information *information, + Objects_Control *the_object, + uint32_t name ) { - /* ASSERT: information->is_string == false */ + _Assert( !information->is_string ); the_object->name.name_u32 = name; _Objects_Set_local_object( @@ -934,15 +938,13 @@ RTEMS_INLINE_ROUTINE void _Objects_Open_u32( * @param[in] name is the name of the object to make accessible */ RTEMS_INLINE_ROUTINE void _Objects_Open_string( - Objects_Information *information, - Objects_Control *the_object, - const char *name + const Objects_Information *information, + Objects_Control *the_object, + const char *name ) { - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - /* ASSERT: information->is_string */ - the_object->name.name_p = name; - #endif + _Assert( information->is_string ); + the_object->name.name_p = name; _Objects_Set_local_object( information, diff --git a/cpukit/posix/src/key.c b/cpukit/posix/src/key.c index 48a52dfb34..71c202926e 100644 --- a/cpukit/posix/src/key.c +++ b/cpukit/posix/src/key.c @@ -142,8 +142,8 @@ static void _POSIX_Keys_Manager_initialization(void) /* maximum objects of this class */ sizeof( POSIX_Keys_Control ), /* size of this object's control block */ - true, /* true if names for this object are strings */ - _POSIX_PATH_MAX, /* maximum length of each object's name */ + false, /* true if names for this object are strings */ + 0, /* maximum length of each object's name */ NULL /* Proxy extraction support callout */ ); diff --git a/cpukit/posix/src/ptimer.c b/cpukit/posix/src/ptimer.c index de3645cc14..e938d50058 100644 --- a/cpukit/posix/src/ptimer.c +++ b/cpukit/posix/src/ptimer.c @@ -66,8 +66,8 @@ static void _POSIX_Timer_Manager_initialization(void) /* maximum objects of this class */ sizeof( POSIX_Timer_Control ), /* size of this object's control block */ - true, /* true if names for this object are strings */ - _POSIX_PATH_MAX, /* maximum length of each object's name */ + false, /* true if names for this object are strings */ + 0, /* maximum length of each object's name */ NULL /* Proxy extraction support callout */ ); } diff --git a/cpukit/posix/src/semaphoredeletesupp.c b/cpukit/posix/src/semaphoredeletesupp.c index dbcfebfd65..69452369fb 100644 --- a/cpukit/posix/src/semaphoredeletesupp.c +++ b/cpukit/posix/src/semaphoredeletesupp.c @@ -23,7 +23,7 @@ void _POSIX_Semaphore_Delete( POSIX_Semaphore_Control *the_semaphore ) { if ( !the_semaphore->linked && !the_semaphore->open_count ) { - _Objects_Close( &_POSIX_Semaphore_Information, &the_semaphore->Object ); + _Objects_Invalidate_Id( &_POSIX_Semaphore_Information, &the_semaphore->Object ); _POSIX_Semaphore_Destroy( &the_semaphore->Semaphore ); _POSIX_Semaphore_Free( the_semaphore ); } diff --git a/cpukit/score/src/objectclose.c b/cpukit/score/src/objectclose.c index 52eb10c60b..e5ee4b5d46 100644 --- a/cpukit/score/src/objectclose.c +++ b/cpukit/score/src/objectclose.c @@ -21,11 +21,11 @@ #include <rtems/score/objectimpl.h> void _Objects_Close( - Objects_Information *information, - Objects_Control *the_object + const Objects_Information *information, + Objects_Control *the_object ) { _Objects_Invalidate_Id( information, the_object ); - _Objects_Namespace_remove( information, the_object ); + _Objects_Namespace_remove_u32( information, the_object ); } diff --git a/cpukit/score/src/objectgetnameasstring.c b/cpukit/score/src/objectgetnameasstring.c index f23b1599e1..ed6a73c0f8 100644 --- a/cpukit/score/src/objectgetnameasstring.c +++ b/cpukit/score/src/objectgetnameasstring.c @@ -45,12 +45,9 @@ size_t _Objects_Name_to_string( char *d; size_t i; -#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( is_string ) { s = name.name_p; - } else -#endif - { + } else { lname[ 0 ] = (name.name_u32 >> 24) & 0xff; lname[ 1 ] = (name.name_u32 >> 16) & 0xff; lname[ 2 ] = (name.name_u32 >> 8) & 0xff; @@ -93,10 +90,10 @@ char *_Objects_Get_name_as_string( char *name ) { - Objects_Information *information; - Objects_Control *the_object; - ISR_lock_Context lock_context; - Objects_Id tmpId; + const Objects_Information *information; + const Objects_Control *the_object; + ISR_lock_Context lock_context; + Objects_Id tmpId; if ( length == 0 ) return NULL; @@ -117,11 +114,7 @@ char *_Objects_Get_name_as_string( _Objects_Name_to_string( the_object->name, -#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) information->is_string, -#else - false, -#endif name, length ); diff --git a/cpukit/score/src/objectidtoname.c b/cpukit/score/src/objectidtoname.c index aff3296738..85eb409a8e 100644 --- a/cpukit/score/src/objectidtoname.c +++ b/cpukit/score/src/objectidtoname.c @@ -40,10 +40,8 @@ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( if ( !information ) return OBJECTS_INVALID_ID; - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - if ( information->is_string ) - return OBJECTS_INVALID_ID; - #endif + if ( information->is_string ) + return OBJECTS_INVALID_ID; the_object = _Objects_Get( tmpId, diff --git a/cpukit/score/src/objectinitializeinformation.c b/cpukit/score/src/objectinitializeinformation.c index 8b1b88db07..23c7819bfa 100644 --- a/cpukit/score/src/objectinitializeinformation.c +++ b/cpukit/score/src/objectinitializeinformation.c @@ -49,9 +49,7 @@ void _Objects_Do_initialize_information( information->inactive_per_block = 0; information->object_blocks = 0; information->inactive = 0; - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - information->is_string = is_string; - #endif + information->is_string = is_string; /* * Set the maximum value to 0. It will be updated when objects are diff --git a/cpukit/score/src/objectnamespaceremove.c b/cpukit/score/src/objectnamespaceremove.c index 6698737254..fb7b54c532 100644 --- a/cpukit/score/src/objectnamespaceremove.c +++ b/cpukit/score/src/objectnamespaceremove.c @@ -22,24 +22,24 @@ #include <rtems/score/objectimpl.h> #include <rtems/score/wkspace.h> -void _Objects_Namespace_remove( - Objects_Information *information, - Objects_Control *the_object +void _Objects_Namespace_remove_u32( + const Objects_Information *information, + Objects_Control *the_object ) { - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - /* - * If this is a string format name, then free the memory. - */ - if ( information->is_string ) - _Workspace_Free( (void *)the_object->name.name_p ); - #endif - - /* - * Clear out either format. - */ - #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) - the_object->name.name_p = NULL; - #endif + _Assert( !information->is_string ); the_object->name.name_u32 = 0; } + +void _Objects_Namespace_remove_string( + const Objects_Information *information, + Objects_Control *the_object +) +{ + void *name; + + _Assert( information->is_string ); + name = the_object->name.name_p; + the_object->name.name_p = NULL; + _Workspace_Free( name ); +} diff --git a/cpukit/score/src/objectnametoidstring.c b/cpukit/score/src/objectnametoidstring.c index bd4b4a9ead..dd69f8a9ea 100644 --- a/cpukit/score/src/objectnametoidstring.c +++ b/cpukit/score/src/objectnametoidstring.c @@ -22,7 +22,6 @@ #include <string.h> -#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) Objects_Control *_Objects_Get_by_name( const Objects_Information *information, const char *name, @@ -72,4 +71,3 @@ Objects_Control *_Objects_Get_by_name( *error = OBJECTS_GET_BY_NAME_NO_OBJECT; return NULL; } -#endif diff --git a/cpukit/score/src/objectsetname.c b/cpukit/score/src/objectsetname.c index c699570209..227de515ec 100644 --- a/cpukit/score/src/objectsetname.c +++ b/cpukit/score/src/objectsetname.c @@ -24,9 +24,9 @@ #include <string.h> bool _Objects_Set_name( - Objects_Information *information, - Objects_Control *the_object, - const char *name + const Objects_Information *information, + Objects_Control *the_object, + const char *name ) { size_t length; @@ -35,7 +35,6 @@ bool _Objects_Set_name( s = name; length = strnlen( name, information->name_length ); -#if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) { char *d; @@ -49,16 +48,13 @@ bool _Objects_Set_name( strncpy( d, name, length ); d[length] = '\0'; the_object->name.name_p = d; - } else -#endif - { + } else { the_object->name.name_u32 = _Objects_Build_name( ((length) ? s[ 0 ] : ' '), ((length > 1) ? s[ 1 ] : ' '), ((length > 2) ? s[ 2 ] : ' '), ((length > 3) ? s[ 3 ] : ' ') ); - } return true; -- 2.16.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel