[rtems commit] score: Add _Per_CPU_Get_snapshot()
Sebastian Huber
sebh at rtems.org
Mon Apr 14 08:00:05 UTC 2014
Module: rtems
Branch: master
Commit: 198c143335c864198f30f8d800c54bb13cc0f15c
Changeset: http://git.rtems.org/rtems/commit/?id=198c143335c864198f30f8d800c54bb13cc0f15c
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Thu Apr 10 08:18:00 2014 +0200
score: Add _Per_CPU_Get_snapshot()
---
cpukit/score/include/rtems/score/percpu.h | 15 ++++++++++++---
1 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/cpukit/score/include/rtems/score/percpu.h b/cpukit/score/include/rtems/score/percpu.h
index 75ff3e2..9a6b169 100644
--- a/cpukit/score/include/rtems/score/percpu.h
+++ b/cpukit/score/include/rtems/score/percpu.h
@@ -424,11 +424,20 @@ extern Per_CPU_Control_envelope _Per_CPU_Information[] CPU_STRUCTURE_ALIGNMENT;
_ISR_Enable( isr_cookie )
#endif
+/*
+ * If we get the current processor index in a context which allows thread
+ * dispatching, then we may already run on another processor right after the
+ * read instruction. There are very few cases in which this makes sense (here
+ * we can use _Per_CPU_Get_snapshot()). All other places must use
+ * _Per_CPU_Get() so that we can add checks for RTEMS_DEBUG.
+ */
+#define _Per_CPU_Get_snapshot() \
+ ( &_Per_CPU_Information[ _SMP_Get_current_processor() ].per_cpu )
+
#if defined( RTEMS_SMP )
static inline Per_CPU_Control *_Per_CPU_Get( void )
{
- Per_CPU_Control *per_cpu =
- &_Per_CPU_Information[ _SMP_Get_current_processor() ].per_cpu;
+ Per_CPU_Control *per_cpu = _Per_CPU_Get_snapshot();
_Assert(
per_cpu->thread_dispatch_disable_level != 0 || _ISR_Get_level() != 0
@@ -437,7 +446,7 @@ static inline Per_CPU_Control *_Per_CPU_Get( void )
return per_cpu;
}
#else
-#define _Per_CPU_Get() ( &_Per_CPU_Information[ 0 ].per_cpu )
+#define _Per_CPU_Get() _Per_CPU_Get_snapshot()
#endif
static inline Per_CPU_Control *_Per_CPU_Get_by_index( uint32_t index )
More information about the vc
mailing list