[PATCH 03/17] score: Add and use thread get/set CPU functions
Sebastian Huber
sebastian.huber at embedded-brains.de
Tue Mar 25 12:49:07 UTC 2014
---
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
More information about the devel
mailing list