[PATCH 03/17] score: Add and use thread get/set CPU functions

Gedare Bloom gedare at rtems.org
Tue Mar 25 14:03:43 UTC 2014


Ok

On Tue, Mar 25, 2014 at 8:49 AM, Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
> ---
>  cpukit/libmisc/cpuuse/cpuusagereport.c             |    4 ++-
>  .../score/include/rtems/score/schedulersmpimpl.h   |    6 ++--
>  cpukit/score/include/rtems/score/threadimpl.h      |   28 +++++++++++++++++++-
>  cpukit/score/src/schedulersmpstartidle.c           |    2 +-
>  cpukit/score/src/threadinitialize.c                |    6 ++--
>  5 files changed, 37 insertions(+), 9 deletions(-)
>
> diff --git a/cpukit/libmisc/cpuuse/cpuusagereport.c b/cpukit/libmisc/cpuuse/cpuusagereport.c
> index fe7e2a4..86b6377 100644
> --- a/cpukit/libmisc/cpuuse/cpuusagereport.c
> +++ b/cpukit/libmisc/cpuuse/cpuusagereport.c
> @@ -26,6 +26,7 @@
>
>  #include <rtems/cpuuse.h>
>  #include <rtems/score/objectimpl.h>
> +#include <rtems/score/threadimpl.h>
>  #include <rtems/score/todimpl.h>
>  #include <rtems/score/watchdogimpl.h>
>
> @@ -43,7 +44,8 @@
>      #else
>        /* FIXME: Locking */
>        if ( the_thread->is_executing ) {
> -        *time_of_context_switch = the_thread->cpu->time_of_last_context_switch;
> +        *time_of_context_switch =
> +          _Thread_Get_CPU( the_thread )->time_of_last_context_switch;
>          return true;
>        }
>      #endif
> diff --git a/cpukit/score/include/rtems/score/schedulersmpimpl.h b/cpukit/score/include/rtems/score/schedulersmpimpl.h
> index f36fcea..d977b3f 100644
> --- a/cpukit/score/include/rtems/score/schedulersmpimpl.h
> +++ b/cpukit/score/include/rtems/score/schedulersmpimpl.h
> @@ -67,8 +67,8 @@ static inline void _Scheduler_SMP_Allocate_processor(
>    Thread_Control *victim
>  )
>  {
> -  Per_CPU_Control *cpu_of_scheduled = scheduled->cpu;
> -  Per_CPU_Control *cpu_of_victim = victim->cpu;
> +  Per_CPU_Control *cpu_of_scheduled = _Thread_Get_CPU( scheduled );
> +  Per_CPU_Control *cpu_of_victim = _Thread_Get_CPU( victim );
>    Thread_Control *heir;
>
>    scheduled->is_scheduled = true;
> @@ -88,7 +88,7 @@ static inline void _Scheduler_SMP_Allocate_processor(
>    if ( heir != victim ) {
>      const Per_CPU_Control *cpu_of_executing = _Per_CPU_Get();
>
> -    heir->cpu = cpu_of_victim;
> +    _Thread_Set_CPU( heir, cpu_of_victim );
>
>      /*
>       * FIXME: Here we need atomic store operations with a relaxed memory order.
> diff --git a/cpukit/score/include/rtems/score/threadimpl.h b/cpukit/score/include/rtems/score/threadimpl.h
> index 1be39b4..cc0d818 100644
> --- a/cpukit/score/include/rtems/score/threadimpl.h
> +++ b/cpukit/score/include/rtems/score/threadimpl.h
> @@ -432,6 +432,32 @@ void _Thread_blocking_operation_Cancel(
>    ISR_Level                         level
>  );
>
> +RTEMS_INLINE_ROUTINE Per_CPU_Control *_Thread_Get_CPU(
> +  const Thread_Control *thread
> +)
> +{
> +#if defined(RTEMS_SMP)
> +  return thread->cpu;
> +#else
> +  (void) thread;
> +
> +  return _Per_CPU_Get();
> +#endif
> +}
> +
> +RTEMS_INLINE_ROUTINE void _Thread_Set_CPU(
> +  Thread_Control *thread,
> +  Per_CPU_Control *cpu
> +)
> +{
> +#if defined(RTEMS_SMP)
> +  thread->cpu = cpu;
> +#else
> +  (void) thread;
> +  (void) cpu;
> +#endif
> +}
> +
>  /**
>   * This function returns true if the_thread is the currently executing
>   * thread, and false otherwise.
> @@ -584,7 +610,7 @@ RTEMS_INLINE_ROUTINE void _Thread_Signal_notification( Thread_Control *thread )
>  #if defined(RTEMS_SMP)
>      if ( thread->is_executing ) {
>        const Per_CPU_Control *cpu_of_executing = _Per_CPU_Get();
> -      Per_CPU_Control *cpu_of_thread = thread->cpu;
> +      Per_CPU_Control *cpu_of_thread = _Thread_Get_CPU( thread );
>
>        if ( cpu_of_executing != cpu_of_thread ) {
>          cpu_of_thread->dispatch_necessary = true;
> diff --git a/cpukit/score/src/schedulersmpstartidle.c b/cpukit/score/src/schedulersmpstartidle.c
> index db98c99..75d1c8f 100644
> --- a/cpukit/score/src/schedulersmpstartidle.c
> +++ b/cpukit/score/src/schedulersmpstartidle.c
> @@ -35,6 +35,6 @@ void _Scheduler_SMP_Start_idle(
>    Scheduler_SMP_Control *self = _Scheduler_SMP_Instance();
>
>    thread->is_scheduled = true;
> -  thread->cpu = cpu;
> +  _Thread_Set_CPU( thread, cpu );
>    _Chain_Append_unprotected( &self->scheduled, &thread->Object.Node );
>  }
> diff --git a/cpukit/score/src/threadinitialize.c b/cpukit/score/src/threadinitialize.c
> index e481f63..df49184 100644
> --- a/cpukit/score/src/threadinitialize.c
> +++ b/cpukit/score/src/threadinitialize.c
> @@ -205,15 +205,15 @@ bool _Thread_Initialize(
>    the_thread->is_scheduled            = false;
>    the_thread->is_in_the_air           = false;
>    the_thread->is_executing            = false;
> -
> -  /* Initialize the cpu field for the non-SMP schedulers */
> -  the_thread->cpu                     = _Per_CPU_Get_by_index( 0 );
>  #if __RTEMS_HAVE_SYS_CPUSET_H__
>     the_thread->affinity               = *(_CPU_set_Default());
>     the_thread->affinity.set           = &the_thread->affinity.preallocated;
>  #endif
>  #endif
>
> +  /* Initialize the CPU for the non-SMP schedulers */
> +  _Thread_Set_CPU( the_thread, _Per_CPU_Get_by_index( 0 ) );
> +
>    the_thread->current_state           = STATES_DORMANT;
>    the_thread->Wait.queue              = NULL;
>    the_thread->resource_count          = 0;
> --
> 1.7.7
>
> _______________________________________________
> rtems-devel mailing list
> rtems-devel at rtems.org
> http://www.rtems.org/mailman/listinfo/rtems-devel



More information about the devel mailing list