diff options
Diffstat (limited to 'cpukit/score/src')
-rw-r--r-- | cpukit/score/src/freechain.c | 25 | ||||
-rw-r--r-- | cpukit/score/src/mpci.c | 2 | ||||
-rw-r--r-- | cpukit/score/src/objectallocate.c | 11 | ||||
-rw-r--r-- | cpukit/score/src/objectextendinformation.c | 52 | ||||
-rw-r--r-- | cpukit/score/src/objectfree.c | 25 | ||||
-rw-r--r-- | cpukit/score/src/objectinitializeinformation.c | 99 | ||||
-rw-r--r-- | cpukit/score/src/objectshrinkinformation.c | 5 | ||||
-rw-r--r-- | cpukit/score/src/thread.c | 36 | ||||
-rw-r--r-- | cpukit/score/src/threadcreateidle.c | 2 | ||||
-rw-r--r-- | cpukit/score/src/threadinitialize.c | 6 | ||||
-rw-r--r-- | cpukit/score/src/threadmp.c | 3 | ||||
-rw-r--r-- | cpukit/score/src/threadrestart.c | 2 | ||||
-rw-r--r-- | cpukit/score/src/wkspace.c | 20 |
13 files changed, 98 insertions, 190 deletions
diff --git a/cpukit/score/src/freechain.c b/cpukit/score/src/freechain.c index 68786b1d7a..57ba293d4b 100644 --- a/cpukit/score/src/freechain.c +++ b/cpukit/score/src/freechain.c @@ -20,31 +20,6 @@ #include <rtems/score/freechain.h> #include <rtems/score/assert.h> -#include <rtems/score/chainimpl.h> - -void _Freechain_Initialize( - Freechain_Control *freechain, - Freechain_Allocator allocator, - size_t number_nodes, - size_t node_size -) -{ - void *starting_address; - - if ( number_nodes > 0 ) { - starting_address = ( *allocator )( number_nodes * node_size ); - number_nodes *= ( starting_address != NULL ); - } else { - starting_address = NULL; - } - - _Chain_Initialize( - &freechain->Free, - starting_address, - number_nodes, - node_size - ); -} void *_Freechain_Get( Freechain_Control *freechain, diff --git a/cpukit/score/src/mpci.c b/cpukit/score/src/mpci.c index 2d0244d887..9b09caa074 100644 --- a/cpukit/score/src/mpci.c +++ b/cpukit/score/src/mpci.c @@ -146,7 +146,7 @@ static void _MPCI_Create_server( void ) name.name_u32 = _Objects_Build_name( 'M', 'P', 'C', 'I' ); _Thread_Initialize( - &_Thread_Internal_information, + &_Thread_Information, _MPCI_Receive_server_tcb, &_Scheduler_Table[ 0 ], NULL, /* allocate the stack */ diff --git a/cpukit/score/src/objectallocate.c b/cpukit/score/src/objectallocate.c index 9213cf8eb7..ad73884a07 100644 --- a/cpukit/score/src/objectallocate.c +++ b/cpukit/score/src/objectallocate.c @@ -68,13 +68,18 @@ Objects_Control *_Objects_Allocate_unprotected( } if ( the_object != NULL ) { + Objects_Maximum objects_per_block; Objects_Maximum block; + objects_per_block = information->objects_per_block; block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM; - block /= information->objects_per_block; - information->inactive_per_block[ block ]--; - information->inactive--; + if ( block > objects_per_block ) { + block /= objects_per_block; + + information->inactive_per_block[ block ]--; + information->inactive--; + } } } diff --git a/cpukit/score/src/objectextendinformation.c b/cpukit/score/src/objectextendinformation.c index 22b9ec671b..b26f591f6e 100644 --- a/cpukit/score/src/objectextendinformation.c +++ b/cpukit/score/src/objectextendinformation.c @@ -61,7 +61,11 @@ void _Objects_Extend_information( _Objects_Allocator_is_owner() || !_System_state_Is_up( _System_state_Get() ) ); + _Assert( _Objects_Is_auto_extend( information ) ); + extend_count = _Objects_Extend_size( information ); + old_maximum = _Objects_Get_maximum_index( information ); + new_maximum = (uint32_t) old_maximum + extend_count; api_class_and_node = information->maximum_id & ~OBJECTS_INDEX_MASK; /* @@ -69,16 +73,12 @@ void _Objects_Extend_information( * extend the block table, then we will change do_extend. */ do_extend = true; - index_base = 0; - block = 0; + index_base = extend_count; + block = 1; if ( information->object_blocks == NULL ) { - extend_count = _Objects_Get_maximum_index( information ); - old_maximum = 0; - block_count = 0; + block_count = 1; } else { - extend_count = information->objects_per_block; - old_maximum = _Objects_Get_maximum_index( information ); block_count = old_maximum / extend_count; for ( ; block < block_count; block++ ) { @@ -90,7 +90,6 @@ void _Objects_Extend_information( } } - new_maximum = (uint32_t) old_maximum + extend_count; index_end = index_base + extend_count; /* @@ -107,12 +106,9 @@ void _Objects_Extend_information( * generate a fatal error depending on auto-extending being active. */ object_block_size = extend_count * information->object_size; - if ( _Objects_Is_auto_extend( information ) ) { - new_object_block = _Workspace_Allocate( object_block_size ); - if ( !new_object_block ) - return; - } else { - new_object_block = _Workspace_Allocate_or_fatal_error( object_block_size ); + new_object_block = _Workspace_Allocate( object_block_size ); + if ( new_object_block == NULL ) { + return; } /* @@ -158,14 +154,10 @@ void _Objects_Extend_information( table_size = object_blocks_size + local_table_size + block_count * sizeof( *inactive_per_block ); - if ( _Objects_Is_auto_extend( information ) ) { - object_blocks = _Workspace_Allocate( table_size ); - if ( !object_blocks ) { - _Workspace_Free( new_object_block ); - return; - } - } else { - object_blocks = _Workspace_Allocate_or_fatal_error( table_size ); + object_blocks = _Workspace_Allocate( table_size ); + if ( object_blocks == NULL ) { + _Workspace_Free( new_object_block ); + return; } /* @@ -186,7 +178,7 @@ void _Objects_Extend_information( */ block_count--; - if ( old_maximum > 0 ) { + if ( old_maximum > extend_count ) { /* * Copy each section of the table over. This has to be performed as * separate parts as size of each block has changed. @@ -201,13 +193,17 @@ void _Objects_Extend_information( information->inactive_per_block, block_count * sizeof( *inactive_per_block ) ); - memcpy( - local_table, - information->local_table, - old_maximum * sizeof( *local_table ) - ); + } else { + object_blocks[ 0 ] = NULL; + inactive_per_block[ 0 ] = 0; } + memcpy( + local_table, + information->local_table, + old_maximum * sizeof( *local_table ) + ); + /* * Initialise the new entries in the table. */ diff --git a/cpukit/score/src/objectfree.c b/cpukit/score/src/objectfree.c index 38ae17d739..c9af8ba7cf 100644 --- a/cpukit/score/src/objectfree.c +++ b/cpukit/score/src/objectfree.c @@ -38,21 +38,24 @@ void _Objects_Free( objects_per_block = information->objects_per_block; block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM; - block /= objects_per_block; - ++information->inactive_per_block[ block ]; + if ( block > objects_per_block ) { + block /= objects_per_block; - inactive = information->inactive; - ++inactive; - information->inactive = inactive; + ++information->inactive_per_block[ block ]; - /* - * Check if the threshold level has been met of - * 1.5 x objects_per_block are free. - */ + inactive = information->inactive; + ++inactive; + information->inactive = inactive; - if ( inactive > ( objects_per_block + ( objects_per_block >> 1 ) ) ) { - _Objects_Shrink_information( information ); + /* + * Check if the threshold level has been met of + * 1.5 x objects_per_block are free. + */ + + if ( inactive > ( objects_per_block + ( objects_per_block >> 1 ) ) ) { + _Objects_Shrink_information( information ); + } } } } diff --git a/cpukit/score/src/objectinitializeinformation.c b/cpukit/score/src/objectinitializeinformation.c index 57e588ad4a..0b2fa2ad0f 100644 --- a/cpukit/score/src/objectinitializeinformation.c +++ b/cpukit/score/src/objectinitializeinformation.c @@ -24,83 +24,50 @@ #include <rtems/score/sysstate.h> #include <rtems/score/wkspace.h> -void _Objects_Do_initialize_information( - Objects_Information *information, - Objects_APIs the_api, - uint16_t the_class, - uint32_t maximum, - uint16_t object_size, - uint16_t maximum_name_length -#if defined(RTEMS_MULTIPROCESSING) - , - Objects_Thread_queue_Extract_callout extract -#endif +void _Objects_Initialize_information( + Objects_Information *information ) { - Objects_Maximum maximum_per_allocation; - - maximum_per_allocation = _Objects_Maximum_per_allocation( maximum ); - information->maximum_id = _Objects_Build_id( - the_api, - the_class, - _Objects_Local_node, - maximum_per_allocation - ); - information->object_size = object_size; + Objects_Id maximum_id; + Objects_Id api_class_and_node; + Objects_Maximum maximum; + Objects_Maximum index; + Chain_Node *head; + Chain_Node *tail; + Chain_Node *current; + Objects_Control *next; - /* - * Register this Object Class in the Object Information Table. - */ - _Objects_Information_table[ the_api ][ the_class ] = information; - - /* - * Are we operating in limited or unlimited (e.g. auto-extend) mode. - */ - if ( _Objects_Is_unlimited( maximum ) ) { - /* - * Unlimited and maximum of zero is illogical. - */ - if ( maximum_per_allocation == 0) { - _Internal_error( INTERNAL_ERROR_UNLIMITED_AND_MAXIMUM_IS_0 ); - } + maximum_id = information->maximum_id; - /* - * The allocation unit is the maximum value - */ - information->objects_per_block = maximum_per_allocation; - } +#if defined(RTEMS_MULTIPROCESSING) + maximum_id |= _Objects_Local_node << OBJECTS_NODE_START_BIT; + information->maximum_id = maximum_id; +#endif + maximum = _Objects_Get_index( maximum_id ); + api_class_and_node = maximum_id & ~OBJECTS_INDEX_MASK; /* - * Calculate the maximum name length - * - * NOTE: Either 4 bytes for Classic API names or an arbitrary - * number for POSIX names which are strings that may be - * an odd number of bytes. + * Register this Object Class in the Object Information Table. */ + _Objects_Information_table[ _Objects_Get_API( maximum_id ) ] + [ _Objects_Get_class( maximum_id ) ] = information; - information->name_length = maximum_name_length; + head = _Chain_Head( &information->Inactive ); + tail = _Chain_Tail( &information->Inactive ); + current = head; + next = information->initial_objects; - _Chain_Initialize_empty( &information->Inactive ); + head->previous = NULL; - /* - * Initialize objects .. if there are any - */ - if ( maximum_per_allocation ) { - /* - * Always have the maximum size available so the current performance - * figures are create are met. If the user moves past the maximum - * number then a performance hit is taken. - */ - _Objects_Extend_information( information ); + for ( index = OBJECTS_INDEX_MINIMUM; index <= maximum ; ++index ) { + current->next = &next->Node; + next->Node.previous = current; + current = &next->Node; + next->id = api_class_and_node | ( index << OBJECTS_INDEX_START_BIT ); + next = _Addresses_Add_offset( next, information->object_size ); } - /* - * Take care of multiprocessing - */ - #if defined(RTEMS_MULTIPROCESSING) - information->extract = extract; - _RBTree_Initialize_empty( &information->Global_by_id ); - _RBTree_Initialize_empty( &information->Global_by_name ); - #endif + current->next = tail; + tail->previous = current; } diff --git a/cpukit/score/src/objectshrinkinformation.c b/cpukit/score/src/objectshrinkinformation.c index 5a53be9979..964f3f5ef6 100644 --- a/cpukit/score/src/objectshrinkinformation.c +++ b/cpukit/score/src/objectshrinkinformation.c @@ -33,6 +33,7 @@ void _Objects_Shrink_information( Objects_Maximum index_base; _Assert( _Objects_Allocator_is_owner() ); + _Assert( _Objects_Is_auto_extend( information ) ); /* * Search the list to find block or chunk with all objects inactive. @@ -40,9 +41,9 @@ void _Objects_Shrink_information( objects_per_block = information->objects_per_block; block_count = _Objects_Get_maximum_index( information ) / objects_per_block; - index_base = 0; + index_base = objects_per_block; - for ( block = 0; block < block_count; block++ ) { + for ( block = 1; block < block_count; block++ ) { if ( information->inactive_per_block[ block ] == objects_per_block ) { Chain_Node *node; const Chain_Node *tail; diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c index 5c27ee00ef..822fb7cb37 100644 --- a/cpukit/score/src/thread.c +++ b/cpukit/score/src/thread.c @@ -20,6 +20,7 @@ #include <rtems/score/threadimpl.h> #include <rtems/score/interr.h> +#include <rtems/score/objectimpl.h> #include <rtems/score/scheduler.h> #include <rtems/score/wkspace.h> @@ -43,30 +44,15 @@ THREAD_OFFSET_ASSERT( Timer ); THREAD_OFFSET_ASSERT( receive_packet ); #endif -Thread_Information _Thread_Internal_information; - -void _Thread_Initialize_information( - Thread_Information *information, - Objects_APIs the_api, - uint16_t the_class, - uint32_t maximum -) +void _Thread_Initialize_information( Thread_Information *information ) { - _Objects_Initialize_information( - &information->Objects, - the_api, - the_class, - maximum, - _Thread_Control_size, - OBJECTS_NO_STRING_NAME, - NULL - ); + _Objects_Initialize_information( &information->Objects ); _Freechain_Initialize( - &information->Free_thread_queue_heads, - _Workspace_Allocate_or_fatal_error, - _Objects_Maximum_per_allocation( maximum ), - THREAD_QUEUE_HEADS_SIZE( _Scheduler_Count ) + &information->Thread_queue_heads.Free, + information->Thread_queue_heads.initial, + _Objects_Get_maximum_index( &information->Objects ), + _Thread_queue_Heads_size ); } @@ -95,11 +81,5 @@ void _Thread_Handler_initialization(void) * per CPU in an SMP system. In addition, if this is a loosely * coupled multiprocessing system, account for the MPCI Server Thread. */ - _Thread_Initialize_information( - &_Thread_Internal_information, - OBJECTS_INTERNAL_API, - OBJECTS_INTERNAL_THREADS, - _Thread_Get_maximum_internal_threads() - ); - + _Thread_Initialize_information( &_Thread_Information ); } diff --git a/cpukit/score/src/threadcreateidle.c b/cpukit/score/src/threadcreateidle.c index d8dd2b4197..cdb2b1eebd 100644 --- a/cpukit/score/src/threadcreateidle.c +++ b/cpukit/score/src/threadcreateidle.c @@ -51,7 +51,7 @@ static void _Thread_Create_idle_for_CPU( Per_CPU_Control *cpu ) _Assert( idle != NULL ); _Thread_Initialize( - &_Thread_Internal_information, + &_Thread_Information, idle, scheduler, NULL, /* allocate the stack */ diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c index df526e9a8e..c15731f99c 100644 --- a/cpukit/score/src/threadinitialize.c +++ b/cpukit/score/src/threadinitialize.c @@ -145,10 +145,10 @@ bool _Thread_Initialize( * Get thread queue heads */ the_thread->Wait.spare_heads = _Freechain_Get( - &information->Free_thread_queue_heads, + &information->Thread_queue_heads.Free, _Workspace_Allocate, _Objects_Extend_size( &information->Objects ), - THREAD_QUEUE_HEADS_SIZE( _Scheduler_Count ) + _Thread_queue_Heads_size ); if ( the_thread->Wait.spare_heads == NULL ) { goto failed; @@ -308,7 +308,7 @@ failed: _Workspace_Free( the_thread->Start.tls_area ); _Freechain_Put( - &information->Free_thread_queue_heads, + &information->Thread_queue_heads.Free, the_thread->Wait.spare_heads ); diff --git a/cpukit/score/src/threadmp.c b/cpukit/score/src/threadmp.c index 4868e8fe4e..006d0f5bcf 100644 --- a/cpukit/score/src/threadmp.c +++ b/cpukit/score/src/threadmp.c @@ -54,8 +54,7 @@ void _Thread_MP_Handler_initialization ( return; } - proxy_size = sizeof( Thread_Proxy_control ) - + THREAD_QUEUE_HEADS_SIZE( _Scheduler_Count ); + proxy_size = sizeof( Thread_Proxy_control ) + _Thread_queue_Heads_size; alloc_size = maximum_proxies * proxy_size; proxies = _Workspace_Allocate_or_fatal_error( alloc_size ); memset( proxies, 0, alloc_size ); diff --git a/cpukit/score/src/threadrestart.c b/cpukit/score/src/threadrestart.c index 66cf4df845..bcd900aa69 100644 --- a/cpukit/score/src/threadrestart.c +++ b/cpukit/score/src/threadrestart.c @@ -176,7 +176,7 @@ static void _Thread_Free( Thread_Control *the_thread ) #endif _Freechain_Put( - &information->Free_thread_queue_heads, + &information->Thread_queue_heads.Free, the_thread->Wait.spare_heads ); diff --git a/cpukit/score/src/wkspace.c b/cpukit/score/src/wkspace.c index c9df793526..95c4127056 100644 --- a/cpukit/score/src/wkspace.c +++ b/cpukit/score/src/wkspace.c @@ -42,24 +42,6 @@ RTEMS_LINKER_RWSET( Heap_Control _Workspace_Area; -static uint32_t _Workspace_Get_maximum_thread_count( void ) -{ - uint32_t thread_count; - - thread_count = 0; - thread_count += _Thread_Get_maximum_internal_threads(); - - thread_count += rtems_resource_maximum_per_allocation( - Configuration_RTEMS_API.maximum_tasks - ); - - thread_count += rtems_resource_maximum_per_allocation( - _Configuration_POSIX_Maximum_threads - ); - - return thread_count; -} - static uintptr_t _Workspace_Space_for_TLS( uintptr_t page_size ) { uintptr_t tls_size; @@ -86,7 +68,7 @@ static uintptr_t _Workspace_Space_for_TLS( uintptr_t page_size ) */ space = _Heap_Min_block_size( page_size ); - space += _Workspace_Get_maximum_thread_count() + space += _Thread_Initial_thread_count * _Heap_Size_with_overhead( page_size, tls_alloc, tls_align ); } else { space = 0; |