mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-26 06:08:20 +00:00
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:
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user