diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-14 10:17:34 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2014-03-31 08:29:42 +0200 |
commit | a5ac9da30737a3aeb2dcb0462a4eba25cb525253 (patch) | |
tree | 7bb4abcb4d350aa9618be52ceb942f63835bc6fc | |
parent | score: Add _Scheduler_Change_priority_if_higher() (diff) | |
download | rtems-a5ac9da30737a3aeb2dcb0462a4eba25cb525253.tar.bz2 |
score: Add and use thread get/set CPU functions
-rw-r--r-- | cpukit/libmisc/cpuuse/cpuusagereport.c | 4 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/schedulersmpimpl.h | 6 | ||||
-rw-r--r-- | cpukit/score/include/rtems/score/threadimpl.h | 28 | ||||
-rw-r--r-- | cpukit/score/src/schedulersmpstartidle.c | 2 | ||||
-rw-r--r-- | 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 <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 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; |