2009-09-13 Joel Sherrill <joel.sherrill@oarcorp.com>

* score/include/rtems/score/thread.h, score/src/threadinitialize.c,
	score/src/threadstackfree.c: Disable capability for API to let user
	provide thread stack when no API configured includes this capability.
This commit is contained in:
Joel Sherrill
2009-09-13 21:00:11 +00:00
parent 8907a01c00
commit bacf79e0b9
4 changed files with 43 additions and 25 deletions

View File

@@ -1,3 +1,9 @@
2009-09-13 Joel Sherrill <joel.sherrill@oarcorp.com>
* score/include/rtems/score/thread.h, score/src/threadinitialize.c,
score/src/threadstackfree.c: Disable capability for API to let user
provide thread stack when no API configured includes this capability.
2009-09-13 Joel Sherrill <joel.sherrill@oarcorp.com>
* score/include/rtems/score/coresem.h, score/src/coresemseize.c:

View File

@@ -35,6 +35,9 @@
#define RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT
#endif
#if defined(RTEMS_POSIX_API)
#define RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API
#endif
#ifdef __cplusplus
extern "C" {
@@ -218,14 +221,16 @@ typedef struct {
uint32_t isr_level;
/** This field is the initial priority. */
Priority_Control initial_priority;
/** This field indicates whether the SuperCore allocated the stack. */
bool core_allocated_stack;
#if defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
/** This field indicates whether the SuperCore allocated the stack. */
bool core_allocated_stack;
#endif
/** This field is the stack information. */
Stack_Control Initial_stack;
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
/** This field is the initial FP context area address. */
Context_Control_fp *fp_context;
#endif
#if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
/** This field is the initial FP context area address. */
Context_Control_fp *fp_context;
#endif
/** This field is the initial stack area address. */
void *stack;
} Thread_Start_information;

View File

@@ -87,18 +87,26 @@ bool _Thread_Initialize(
/*
* Allocate and Initialize the stack for this thread.
*/
if ( !stack_area ) {
#if !defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < 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;
}
#else
if ( !stack_area ) {
actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size );
if ( !actual_stack_size || actual_stack_size < 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;
}
#endif
_Stack_Initialize(
&the_thread->Start.Initial_stack,

View File

@@ -41,23 +41,22 @@ void _Thread_Stack_Free(
Thread_Control *the_thread
)
{
#if defined(RTEMS_SCORE_THREAD_ENABLE_USER_PROVIDED_STACK_VIA_API)
/*
* If the API provided the stack space, then don't free it.
*/
if ( !the_thread->Start.core_allocated_stack )
return;
#endif
/*
* Call ONLY the CPU table stack free hook, or the
* the RTEMS workspace free. This is so the free
* routine properly matches the allocation of the stack.
*/
/*
* Call ONLY the CPU table stack free hook, or the
* the RTEMS workspace free. This is so the 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 );
if ( Configuration.stack_free_hook )
(*Configuration.stack_free_hook)( the_thread->Start.Initial_stack.area );
else
_Workspace_Free( the_thread->Start.Initial_stack.area );
}