[PATCH 15/18] score: Add _SMP_Synchronize()

Sebastian Huber sebastian.huber at embedded-brains.de
Mon May 20 07:33:41 UTC 2019


---
 cpukit/include/rtems/score/smpimpl.h  |  8 ++++++++
 cpukit/score/src/smpmulticastaction.c | 10 ++++++++++
 testsuites/smptests/smpipi01/init.c   |  7 ++++---
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/cpukit/include/rtems/score/smpimpl.h b/cpukit/include/rtems/score/smpimpl.h
index c0fe7a03e2..e52a82cf25 100644
--- a/cpukit/include/rtems/score/smpimpl.h
+++ b/cpukit/include/rtems/score/smpimpl.h
@@ -261,6 +261,14 @@ void _SMP_Othercast_action(
   void               *arg
 );
 
+/**
+ * @brief Ensures that all store operations issued by the current processor
+ * before the call this function are visible to all other online processors.
+ *
+ * Simply calls _SMP_Othercast_action() with an empty multicast action.
+ */
+void _SMP_Synchronize( void );
+
 #endif /* defined( RTEMS_SMP ) */
 
 /**
diff --git a/cpukit/score/src/smpmulticastaction.c b/cpukit/score/src/smpmulticastaction.c
index b5d21a4b56..232b3142fd 100644
--- a/cpukit/score/src/smpmulticastaction.c
+++ b/cpukit/score/src/smpmulticastaction.c
@@ -211,3 +211,13 @@ void _SMP_Othercast_action(
   _Processor_mask_Clear( &targets, _SMP_Get_current_processor() );
   _SMP_Multicast_action( &targets, handler, arg );
 }
+
+static void _SMP_Do_nothing_action( void *arg )
+{
+  /* Do nothing */
+}
+
+void _SMP_Synchronize( void )
+{
+  _SMP_Othercast_action( _SMP_Do_nothing_action, NULL );
+}
diff --git a/testsuites/smptests/smpipi01/init.c b/testsuites/smptests/smpipi01/init.c
index 18d96dafaf..3cc7a13e2d 100644
--- a/testsuites/smptests/smpipi01/init.c
+++ b/testsuites/smptests/smpipi01/init.c
@@ -18,7 +18,6 @@
 
 #include <rtems/score/smpimpl.h>
 #include <rtems/score/smpbarrier.h>
-#include <rtems/counter.h>
 #include <rtems.h>
 
 #include <stdio.h>
@@ -195,10 +194,12 @@ static void test_send_message_flood(
   }
 
   for (cpu_index = 0; cpu_index < cpu_count; ++cpu_index) {
+    Per_CPU_Control *cpu_self;
     uint32_t i;
 
-    /* Wait 1us so that all outstanding messages have been processed */
-    rtems_counter_delay_nanoseconds(1000000);
+    cpu_self = _Thread_Dispatch_disable();
+    _SMP_Synchronize();
+    _Thread_Dispatch_enable(cpu_self);
 
     for (i = 0; i < cpu_count; ++i) {
       if (i != cpu_index) {
-- 
2.16.4



More information about the devel mailing list