[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