[PATCH] score: Optimize Objects_Information
Sebastian Huber
sebastian.huber at embedded-brains.de
Mon Nov 5 10:40:55 UTC 2018
Reduce structure internal padding. Group members used by _Objects_Get()
together. Reduce size of some members.
Format and simplify _Objects_Extend_information().
---
cpukit/include/rtems/score/objectimpl.h | 28 +++----
cpukit/score/src/objectextendinformation.c | 116 +++++++++++++----------------
2 files changed, 66 insertions(+), 78 deletions(-)
diff --git a/cpukit/include/rtems/score/objectimpl.h b/cpukit/include/rtems/score/objectimpl.h
index 1bef14b116..bf4d45df4a 100644
--- a/cpukit/include/rtems/score/objectimpl.h
+++ b/cpukit/include/rtems/score/objectimpl.h
@@ -120,36 +120,36 @@ typedef void ( *Objects_Thread_queue_Extract_callout )(
* manage each class of objects.
*/
typedef struct {
- /** This field indicates the API of this object class. */
- Objects_APIs the_api;
- /** This is the class of this object set. */
- uint16_t the_class;
/** This is the minimum valid id of this object class. */
Objects_Id minimum_id;
/** This is the maximum valid id of this object class. */
Objects_Id maximum_id;
+ /** This points to the table of local objects. */
+ Objects_Control **local_table;
/** This is the maximum number of objects in this class. */
Objects_Maximum maximum;
+ /** This is the number of objects on the Inactive list. */
+ Objects_Maximum inactive;
+ /** This is the number of objects in a block. */
+ Objects_Maximum allocation_size;
+ /** This is the maximum length of names. */
+ uint16_t name_length;
+ /** This field indicates the API of this object class. */
+ uint8_t the_api;
+ /** This is the class of this object set. */
+ uint8_t the_class;
/** 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. */
- Objects_Maximum allocation_size;
/** This is the size in bytes of each object instance. */
size_t size;
- /** This points to the table of local objects. */
- Objects_Control **local_table;
/** This is the chain of inactive control blocks. */
Chain_Control Inactive;
- /** This is the number of objects on the Inactive list. */
- Objects_Maximum inactive;
/** This is the number of inactive objects per block. */
- uint32_t *inactive_per_block;
+ Objects_Maximum *inactive_per_block;
/** This is a table to the chain of inactive object memory blocks. */
- void **object_blocks;
- /** This is the maximum length of names. */
- uint16_t name_length;
+ Objects_Control **object_blocks;
#if defined(RTEMS_MULTIPROCESSING)
/** This is this object class' method called when extracting a thread. */
Objects_Thread_queue_Extract_callout extract;
diff --git a/cpukit/score/src/objectextendinformation.c b/cpukit/score/src/objectextendinformation.c
index f4ac11be43..d2ee7fdf8b 100644
--- a/cpukit/score/src/objectextendinformation.c
+++ b/cpukit/score/src/objectextendinformation.c
@@ -51,8 +51,8 @@ void _Objects_Extend_information(
uint32_t minimum_index;
uint32_t index;
uint32_t maximum;
- size_t block_size;
- void *new_object_block;
+ size_t object_block_size;
+ Objects_Control *new_object_block;
bool do_extend;
_Assert(
@@ -100,13 +100,13 @@ void _Objects_Extend_information(
* Allocate the name table, and the objects and if it fails either return or
* generate a fatal error depending on auto-extending being active.
*/
- block_size = information->allocation_size * information->size;
+ object_block_size = information->allocation_size * information->size;
if ( information->auto_extend ) {
- new_object_block = _Workspace_Allocate( block_size );
+ new_object_block = _Workspace_Allocate( object_block_size );
if ( !new_object_block )
return;
} else {
- new_object_block = _Workspace_Allocate_or_fatal_error( block_size );
+ new_object_block = _Workspace_Allocate_or_fatal_error( object_block_size );
}
/*
@@ -114,13 +114,13 @@ void _Objects_Extend_information(
*/
if ( do_extend ) {
ISR_lock_Context lock_context;
- void **object_blocks;
- uint32_t *inactive_per_block;
+ Objects_Control **object_blocks;
Objects_Control **local_table;
+ Objects_Maximum *inactive_per_block;
void *old_tables;
- size_t block_size;
+ size_t table_size;
uintptr_t object_blocks_size;
- uintptr_t inactive_per_block_size;
+ uintptr_t local_table_size;
/*
* Growing the tables means allocating a new area, doing a copy and
@@ -129,58 +129,49 @@ void _Objects_Extend_information(
* If the maximum is minimum we do not have a table to copy. First
* time through.
*
- * The allocation has :
+ * The allocation has:
*
- * void *objects[block_count];
- * uint32_t inactive_count[block_count];
- * Objects_Control *local_table[maximum];
+ * Objects_Control *object_blocks[ block_count ];
+ * Objects_Control *local_table[ maximum ];
+ * Objects_Maximum inactive_count[ block_count ];
*
* This is the order in memory. Watch changing the order. See the memcpy
* below.
*/
/*
- * Up the block count and maximum
+ * Up the block count and maximum.
*/
block_count++;
/*
- * Allocate the tables and break it up. The tables are:
- * 1. object_blocks : void*
- * 2. inactive_per_blocks : uint32_t
- * 3. local_table : Objects_Name*
+ * Allocate the tables and break it up.
*/
- object_blocks_size = (uintptr_t)_Addresses_Align_up(
- (void*)(block_count * sizeof(void*)),
- CPU_ALIGNMENT
- );
- inactive_per_block_size =
- (uintptr_t)_Addresses_Align_up(
- (void*)(block_count * sizeof(uint32_t)),
- CPU_ALIGNMENT
- );
- block_size = object_blocks_size + inactive_per_block_size +
- ((maximum + minimum_index) * sizeof(Objects_Control *));
+ object_blocks_size = block_count * sizeof( *object_blocks );
+ local_table_size = ( maximum + minimum_index ) * sizeof( *local_table );
+ table_size = object_blocks_size
+ + local_table_size
+ + block_count * sizeof( *inactive_per_block );
if ( information->auto_extend ) {
- object_blocks = _Workspace_Allocate( block_size );
+ object_blocks = _Workspace_Allocate( table_size );
if ( !object_blocks ) {
_Workspace_Free( new_object_block );
return;
}
} else {
- object_blocks = _Workspace_Allocate_or_fatal_error( block_size );
+ object_blocks = _Workspace_Allocate_or_fatal_error( table_size );
}
/*
* Break the block into the various sections.
*/
- inactive_per_block = (uint32_t *) _Addresses_Add_offset(
- object_blocks,
- object_blocks_size
+ local_table = _Addresses_Add_offset(
+ object_blocks,
+ object_blocks_size
);
- local_table = (Objects_Control **) _Addresses_Add_offset(
- inactive_per_block,
- inactive_per_block_size
+ inactive_per_block = _Addresses_Add_offset(
+ local_table,
+ local_table_size
);
/*
@@ -190,23 +181,26 @@ void _Objects_Extend_information(
block_count--;
if ( information->maximum > minimum_index ) {
-
/*
* Copy each section of the table over. This has to be performed as
* separate parts as size of each block has changed.
*/
-
- memcpy( object_blocks,
- information->object_blocks,
- block_count * sizeof(void*) );
- memcpy( inactive_per_block,
- information->inactive_per_block,
- block_count * sizeof(uint32_t) );
- memcpy( local_table,
- information->local_table,
- (information->maximum + minimum_index) * sizeof(Objects_Control *) );
+ memcpy(
+ object_blocks,
+ information->object_blocks,
+ block_count * sizeof( *object_blocks )
+ );
+ memcpy(
+ inactive_per_block,
+ information->inactive_per_block,
+ block_count * sizeof( *inactive_per_block )
+ );
+ memcpy(
+ local_table,
+ information->local_table,
+ ( information->maximum + minimum_index ) * sizeof( *local_table )
+ );
} else {
-
/*
* Deal with the special case of the 0 to minimum_index
*/
@@ -218,9 +212,6 @@ void _Objects_Extend_information(
/*
* Initialise the new entries in the table.
*/
- object_blocks[block_count] = NULL;
- inactive_per_block[block_count] = 0;
-
for ( index = index_base ; index < index_end ; ++index ) {
local_table[ index ] = NULL;
}
@@ -235,11 +226,11 @@ void _Objects_Extend_information(
information->local_table = local_table;
information->maximum = (Objects_Maximum) maximum;
information->maximum_id = _Objects_Build_id(
- information->the_api,
- information->the_class,
- _Objects_Local_node,
- information->maximum
- );
+ information->the_api,
+ information->the_class,
+ _Objects_Local_node,
+ information->maximum
+ );
_ISR_lock_ISR_enable( &lock_context );
@@ -252,11 +243,13 @@ void _Objects_Extend_information(
* Assign the new object block to the object block table.
*/
information->object_blocks[ block ] = new_object_block;
+ information->inactive_per_block[ block ] = information->allocation_size;
+ information->inactive += information->allocation_size;
/*
* Append to inactive chain.
*/
- the_object = information->object_blocks[ block ];
+ the_object = new_object_block;
for ( index = index_base ; index < index_end ; ++index ) {
the_object->id = _Objects_Build_id(
information->the_api,
@@ -268,11 +261,6 @@ void _Objects_Extend_information(
_Chain_Initialize_node( &the_object->Node );
_Chain_Append_unprotected( &information->Inactive, &the_object->Node );
- the_object = (Objects_Control *)
- ( (char *) the_object + information->size );
+ the_object = _Addresses_Add_offset( the_object, information->size );
}
-
- information->inactive_per_block[ block ] = information->allocation_size;
- information->inactive =
- (Objects_Maximum)(information->inactive + information->allocation_size);
}
--
2.16.4
More information about the devel
mailing list