From 577293f0a959b5368c073d51f3404c57b3680d14 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Sun, 28 Apr 2019 14:31:10 +0200 Subject: score: Add _SMP_Synchronize() --- 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 #include -#include #include #include @@ -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) { -- cgit v1.2.3