summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-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) {