From 05df0a846f436295a490cc9ac19e5a4061c3a575 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 17 May 1999 20:41:13 +0000 Subject: Thread Handler split into multiple files. Eventually, as RTEMS is split into one function per file, this will decrease the size of executables. --- c/src/exec/score/src/threadinitialize.c | 175 ++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 c/src/exec/score/src/threadinitialize.c (limited to 'c/src/exec/score/src/threadinitialize.c') diff --git a/c/src/exec/score/src/threadinitialize.c b/c/src/exec/score/src/threadinitialize.c new file mode 100644 index 0000000000..3188cfb438 --- /dev/null +++ b/c/src/exec/score/src/threadinitialize.c @@ -0,0 +1,175 @@ +/* + * Thread Handler + * + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/*PAGE + * + * _Thread_Initialize + * + * XXX + */ + +boolean _Thread_Initialize( + Objects_Information *information, + Thread_Control *the_thread, + void *stack_area, + unsigned32 stack_size, + boolean is_fp, + Priority_Control priority, + boolean is_preemptible, + Thread_CPU_budget_algorithms budget_algorithm, + Thread_CPU_budget_algorithm_callout budget_callout, + unsigned32 isr_level, + Objects_Name name +) +{ + unsigned32 actual_stack_size = 0; + void *stack = NULL; + void *fp_area; + void *extensions_area; + + /* + * Initialize the Ada self pointer + */ + + the_thread->rtems_ada_self = NULL; + + /* + * Allocate and Initialize the stack for this thread. + */ + + + if ( !stack_area ) { + if ( !_Stack_Is_enough( stack_size ) ) + actual_stack_size = STACK_MINIMUM_SIZE; + else + actual_stack_size = stack_size; + + actual_stack_size = _Thread_Stack_Allocate( the_thread, actual_stack_size ); + + if ( !actual_stack_size ) + return FALSE; /* stack allocation failed */ + + stack = the_thread->Start.stack; + the_thread->Start.core_allocated_stack = TRUE; + } else { + stack = stack_area; + actual_stack_size = stack_size; + the_thread->Start.core_allocated_stack = FALSE; + } + + _Stack_Initialize( + &the_thread->Start.Initial_stack, + stack, + actual_stack_size + ); + + /* + * Allocate the floating point area for this thread + */ + + if ( is_fp ) { + + fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); + if ( !fp_area ) { + _Thread_Stack_Free( the_thread ); + return FALSE; + } + fp_area = _Context_Fp_start( fp_area, 0 ); + + } else + fp_area = NULL; + + the_thread->fp_context = fp_area; + the_thread->Start.fp_context = fp_area; + + /* + * Allocate the extensions area for this thread + */ + + if ( _Thread_Maximum_extensions ) { + extensions_area = _Workspace_Allocate( + (_Thread_Maximum_extensions + 1) * sizeof( void * ) + ); + + if ( !extensions_area ) { + if ( fp_area ) + (void) _Workspace_Free( fp_area ); + + _Thread_Stack_Free( the_thread ); + + return FALSE; + } + } else + extensions_area = NULL; + + the_thread->extensions = (void **) extensions_area; + + /* + * General initialization + */ + + the_thread->Start.is_preemptible = is_preemptible; + the_thread->Start.budget_algorithm = budget_algorithm; + the_thread->Start.budget_callout = budget_callout; + the_thread->Start.isr_level = isr_level; + + the_thread->current_state = STATES_DORMANT; + the_thread->resource_count = 0; + the_thread->real_priority = priority; + the_thread->Start.initial_priority = priority; + the_thread->ticks_executed = 0; + + _Thread_Set_priority( the_thread, priority ); + + /* + * Open the object + */ + + _Objects_Open( information, &the_thread->Object, name ); + + /* + * Invoke create extensions + */ + + if ( !_User_extensions_Thread_create( the_thread ) ) { + + if ( extensions_area ) + (void) _Workspace_Free( extensions_area ); + + if ( fp_area ) + (void) _Workspace_Free( fp_area ); + + _Thread_Stack_Free( the_thread ); + + return FALSE; + } + + return TRUE; + +} -- cgit v1.2.3