From 9fa3cf0db84cbabdb639cdeb7565f4c3ca3bc562 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 14 Dec 2011 13:17:19 +0000 Subject: 2011-12-14 Sebastian Huber PR 1924/cpukit * sapi/include/rtems/config.h: Added stack_allocate_init_hook to rtems_configuration_table. * sapi/include/confdefs.h: Added CONFIGURE_TASK_STACK_FROM_ALLOCATOR and CONFIGURE_TASK_STACK_ALLOCATOR_INIT defines. Set default stack allocator and free hook to _Workspace_Allocate() and _Workspace_Free() respectively. * score/src/thread.c, score/src/threadstackallocate.c, score/src/threadstackfree.c: Update due to API changes. --- cpukit/score/src/thread.c | 27 +++++++++++++-------------- cpukit/score/src/threadstackallocate.c | 33 ++++++++++++--------------------- cpukit/score/src/threadstackfree.c | 8 ++++---- 3 files changed, 29 insertions(+), 39 deletions(-) (limited to 'cpukit/score') diff --git a/cpukit/score/src/thread.c b/cpukit/score/src/thread.c index 3736f6eda8..613ef77e92 100644 --- a/cpukit/score/src/thread.c +++ b/cpukit/score/src/thread.c @@ -49,30 +49,29 @@ void _Thread_Handler_initialization(void) { - uint32_t ticks_per_timeslice; - uint32_t maximum_extensions; + uint32_t ticks_per_timeslice = + rtems_configuration_get_ticks_per_timeslice(); + uint32_t maximum_extensions = + rtems_configuration_get_maximum_extensions(); + rtems_stack_allocate_init_hook stack_allocate_init_hook = + rtems_configuration_get_stack_allocate_init_hook(); uint32_t maximum_internal_threads; #if defined(RTEMS_MULTIPROCESSING) - uint32_t maximum_proxies; + uint32_t maximum_proxies = + _Configuration_MP_table->maximum_proxies; #endif - ticks_per_timeslice = Configuration.ticks_per_timeslice; - maximum_extensions = Configuration.maximum_extensions; - #if defined(RTEMS_MULTIPROCESSING) - maximum_proxies = _Configuration_MP_table->maximum_proxies; - #endif - /* - * BOTH stacks hooks must be set or both must be NULL. - * Do not allow mixture. - */ - if ( !( (!Configuration.stack_allocate_hook) - == (!Configuration.stack_free_hook) ) ) + if ( rtems_configuration_get_stack_allocate_hook() == NULL || + rtems_configuration_get_stack_free_hook() == NULL) _Internal_error_Occurred( INTERNAL_ERROR_CORE, true, INTERNAL_ERROR_BAD_STACK_HOOK ); + if ( stack_allocate_init_hook != NULL ) + (*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() ); + _Thread_Dispatch_necessary = false; _Thread_Executing = NULL; _Thread_Heir = NULL; diff --git a/cpukit/score/src/threadstackallocate.c b/cpukit/score/src/threadstackallocate.c index 0989161f1e..9448328365 100644 --- a/cpukit/score/src/threadstackallocate.c +++ b/cpukit/score/src/threadstackallocate.c @@ -46,33 +46,24 @@ size_t _Thread_Stack_Allocate( { void *stack_addr = 0; size_t the_stack_size; + rtems_stack_allocate_hook stack_allocate_hook = + rtems_configuration_get_stack_allocate_hook(); the_stack_size = _Stack_Ensure_minimum( stack_size ); /* - * Call ONLY the CPU table stack allocate hook, _or_ the - * the RTEMS workspace allocate. This is so the stack free - * routine can call the correct deallocation routine. + * Pad the requested size so we allocate enough memory + * so the context initialization can align it properly. The address + * returned the workspace allocate must be directly stored in the + * stack control block because it is later used in the free sequence. + * + * Thus it is the responsibility of the CPU dependent code to + * get and keep the stack adjust factor, the stack alignment, and + * the context initialization sequence in sync. */ + the_stack_size = _Stack_Adjust_size( the_stack_size ); - if ( Configuration.stack_allocate_hook ) { - stack_addr = (*Configuration.stack_allocate_hook)( the_stack_size ); - } else { - - /* - * First pad the requested size so we allocate enough memory - * so the context initialization can align it properly. The address - * returned the workspace allocate must be directly stored in the - * stack control block because it is later used in the free sequence. - * - * Thus it is the responsibility of the CPU dependent code to - * get and keep the stack adjust factor, the stack alignment, and - * the context initialization sequence in sync. - */ - - the_stack_size = _Stack_Adjust_size( the_stack_size ); - stack_addr = _Workspace_Allocate( the_stack_size ); - } + stack_addr = (*stack_allocate_hook)( the_stack_size ); if ( !stack_addr ) the_stack_size = 0; diff --git a/cpukit/score/src/threadstackfree.c b/cpukit/score/src/threadstackfree.c index 64e0278e1b..926c1e9eb1 100644 --- a/cpukit/score/src/threadstackfree.c +++ b/cpukit/score/src/threadstackfree.c @@ -41,6 +41,9 @@ void _Thread_Stack_Free( Thread_Control *the_thread ) { + rtems_stack_free_hook stack_free_hook = + rtems_configuration_get_stack_free_hook(); + #if defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API) /* * If the API provided the stack space, then don't free it. @@ -55,8 +58,5 @@ void _Thread_Stack_Free( * routine properly matches the allocation of the stack. */ - if ( Configuration.stack_free_hook ) - (*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area ); - else - _Workspace_Free( the_thread->Start.Initial_stack.area ); + (*stack_free_hook)( the_thread->Start.Initial_stack.area ); } -- cgit v1.2.3