[PATCH 02/21] score: Simplify thread stack allocation

Gedare Bloom gedare at rtems.org
Thu Jan 2 17:34:33 UTC 2020


On Mon, Dec 16, 2019 at 7:28 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> Remove superfluous Thread_Control::Start::stack member.
>
> Update #3835.
> ---
>  cpukit/include/rtems/score/stackimpl.h  | 10 ++++++++++
>  cpukit/include/rtems/score/thread.h     |  2 --
>  cpukit/include/rtems/score/threadimpl.h | 17 -----------------
>  cpukit/score/src/threadinitialize.c     | 29 ++++++++++++++---------------
>  cpukit/score/src/threadstackallocate.c  | 28 +++++-----------------------
>  5 files changed, 29 insertions(+), 57 deletions(-)
>
> diff --git a/cpukit/include/rtems/score/stackimpl.h b/cpukit/include/rtems/score/stackimpl.h
> index 98eda3148a..6b14560c9b 100644
> --- a/cpukit/include/rtems/score/stackimpl.h
> +++ b/cpukit/include/rtems/score/stackimpl.h
> @@ -105,6 +105,16 @@ RTEMS_INLINE_ROUTINE size_t _Stack_Ensure_minimum (
>    return _Stack_Minimum();
>  }
>
> +/**
> + * @brief Allocate the requested stack space.
> + *
> + * @param stack_size The stack space that is requested.
> + *
> + * @retval stack_area The allocated stack area.
> + * @retval NULL The allocation failed.
> + */
> +void *_Stack_Allocate( size_t stack_size );
> +
>  /** @} */
>
>  #ifdef __cplusplus
> diff --git a/cpukit/include/rtems/score/thread.h b/cpukit/include/rtems/score/thread.h
> index bd8de4ef81..5c62efc1f7 100644
> --- a/cpukit/include/rtems/score/thread.h
> +++ b/cpukit/include/rtems/score/thread.h
> @@ -209,8 +209,6 @@ typedef struct {
>      /** 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;
>    /** The thread-local storage (TLS) area */
>    void                                *tls_area;
>  } Thread_Start_information;
> diff --git a/cpukit/include/rtems/score/threadimpl.h b/cpukit/include/rtems/score/threadimpl.h
> index 2e41b80bd4..937175f713 100644
> --- a/cpukit/include/rtems/score/threadimpl.h
> +++ b/cpukit/include/rtems/score/threadimpl.h
> @@ -130,23 +130,6 @@ void _Thread_Create_idle(void);
>   */
>  void _Thread_Start_multitasking( void ) RTEMS_NO_RETURN;
>
> -/**
> - * @brief Allocates the requested stack space for the thread.
> - *
> - * Allocate the requested stack space for the thread.
> - * Set the Start.stack field to the address of the stack.
> - *
> - * @param[out] the_thread The thread where the stack space is requested.
> - * @param stack_size The stack space that is requested.
> - *
> - * @retval actual Size allocated after any adjustment.
> - * @retval zero The allocation failed.
> - */
> -size_t _Thread_Stack_Allocate(
> -  Thread_Control *the_thread,
> -  size_t          stack_size
> -);
> -
>  /**
>   * @brief Deallocates thread stack.
>   *
> diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
> index 83c689eee4..3b04ed26ab 100644
> --- a/cpukit/score/src/threadinitialize.c
> +++ b/cpukit/score/src/threadinitialize.c
> @@ -43,8 +43,6 @@ bool _Thread_Initialize(
>  )
>  {
>    uintptr_t                tls_size = _TLS_Get_size();
> -  size_t                   actual_stack_size = 0;
> -  void                    *stack = NULL;
>    #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE )
>      void                  *fp_area = NULL;
>    #endif
> @@ -92,30 +90,31 @@ bool _Thread_Initialize(
>     *  Allocate and Initialize the stack for this thread.
>     */
>    #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_size = _Stack_Ensure_minimum( stack_size );
> +    stack_area = _Stack_Allocate( stack_size );
>
> -    stack = the_thread->Start.stack;
> +    if ( stack_area == NULL ) {
> +      return 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 */
> +    if ( stack_area == NULL ) {
> +      stack_size = _Stack_Ensure_minimum( stack_size );
> +      stack_area = _Stack_Allocate( stack_size );
> +
> +      if ( stack_area == NULL ) {
> +        return false;
> +      }
>
> -      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,
> -     stack,
> -     actual_stack_size
> +     stack_area,
> +     stack_size
>    );
>
>    scheduler_index = 0;
> diff --git a/cpukit/score/src/threadstackallocate.c b/cpukit/score/src/threadstackallocate.c
> index fd89d7f07f..722de7bfd6 100644
> --- a/cpukit/score/src/threadstackallocate.c
> +++ b/cpukit/score/src/threadstackallocate.c
> @@ -1,11 +1,11 @@
>  /**
>   * @file
> - *
> + *
> + * @ingroup RTEMSScoreStack
> + *
>   * @brief Stack Allocate Helper
> - * @ingroup RTEMSScoreThread
>   */
>
> -
>  /*
>   *  COPYRIGHT (c) 1989-2010.
>   *  On-Line Applications Research Corporation (OAR).
> @@ -19,28 +19,10 @@
>  #include "config.h"
>  #endif
>
> -#include <rtems/score/threadimpl.h>
>  #include <rtems/score/stackimpl.h>
>  #include <rtems/config.h>
>
> -size_t _Thread_Stack_Allocate(
> -  Thread_Control *the_thread,
> -  size_t          stack_size
> -)
> +void *_Stack_Allocate( size_t stack_size )

The function is in a new namespace. Should the change reflect in filename too?

>  {
> -  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 );
> -
> -  stack_addr = (*stack_allocate_hook)( the_stack_size );
> -
> -  if ( !stack_addr )
> -    the_stack_size = 0;
> -
> -  the_thread->Start.stack = stack_addr;
> -
> -  return the_stack_size;
> +  return ( *rtems_configuration_get_stack_allocate_hook() )( stack_size );
>  }
> --
> 2.16.4
>
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list