summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-04-28 14:31:10 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-05-20 09:01:15 +0200
commit577293f0a959b5368c073d51f3404c57b3680d14 (patch)
treeb7a65ec24fa9c01c721f7e0e5283636d1bf35b01
parentscore: Remove unused SMP_MESSAGE_TEST (diff)
downloadrtems-577293f0a959b5368c073d51f3404c57b3680d14.tar.bz2
score: Add _SMP_Synchronize()
-rw-r--r--cpukit/include/rtems/score/smpimpl.h8
-rw-r--r--cpukit/score/src/smpmulticastaction.c10
-rw-r--r--testsuites/smptests/smpipi01/init.c7
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) {