From a5ac9da30737a3aeb2dcb0462a4eba25cb525253 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 14 Mar 2014 10:17:34 +0100 Subject: score: Add and use thread get/set CPU functions --- 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 fe7e2a401c..86b637707a 100644 --- a/cpukit/libmisc/cpuuse/cpuusagereport.c +++ b/cpukit/libmisc/cpuuse/cpuusagereport.c @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -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 f36fcea201..d977b3f319 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 1be39b4e72..cc0d818a07 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 db98c99b40..75d1c8f8f5 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 e481f63618..df491849c4 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; -- cgit v1.2.3