When the test suite is run on an OS with 1 core (e.g., a VM with one core assigned to it), some of the atomic memory model tests take a long time, with the effect that the test seems stuck.
This patch stops these tests after one second and only fails the test if there has not been any significant progress, allowing the test to pass also when running only with one core. Reported-by: Motonori Shindo <moton...@shin.do> Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com> --- tests/test-atomic.c | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/tests/test-atomic.c b/tests/test-atomic.c index dcd0a73..0f7f2c0 100644 --- a/tests/test-atomic.c +++ b/tests/test-atomic.c @@ -17,9 +17,13 @@ #include <config.h> #undef NDEBUG #include "ovs-atomic.h" -#include "util.h" #include "ovstest.h" #include "ovs-thread.h" +#include "timeval.h" +#include "util.h" +#include "openvswitch/vlog.h" + +VLOG_DEFINE_THIS_MODULE(test_atomic); #define TEST_ATOMIC_TYPE(ATOMIC_TYPE, BASE_TYPE) \ { \ @@ -186,6 +190,7 @@ atomic_consumer(void * arg1 OVS_UNUSED) { struct atomic_aux *old_aux = NULL; uint64_t count; + long long int stop_time = time_msec() + 1000; do { struct atomic_aux *aux; @@ -202,7 +207,14 @@ atomic_consumer(void * arg1 OVS_UNUSED) ovs_assert(b == count + 42); old_aux = aux; - } while (count < ATOMIC_ITEM_COUNT - 1); + } while (count < ATOMIC_ITEM_COUNT - 1 && time_msec() < stop_time); + + if (time_msec() >= stop_time) { + if (count < 10) { + VLOG_INFO("atomic_consumer test stopped due to excessive runtime. " + "Count = %"PRIu64, count); + } + } return NULL; } @@ -249,6 +261,8 @@ atomic_reader(void *aux_) struct atomic_aux *aux = aux_; uint64_t count; uint64_t data; + long long int now = time_msec(); + long long int stop_time = now + 1000; do { /* Non-synchronized add. */ @@ -256,7 +270,15 @@ atomic_reader(void *aux_) do { atomic_read_explicit(&aux->data64, &data, memory_order_acquire); - } while (!data); + } while (!data && (now = time_msec()) < stop_time); + + if (now >= stop_time) { + if (count < 10) { + VLOG_INFO("atomic_reader test stopped due to excessive " + "runtime. Count = %"PRIu64, count); + } + break; + } ovs_assert(data == a && data == aux->b && a == aux->b); @@ -277,12 +299,22 @@ atomic_writer(void *aux_) uint64_t old_count; uint64_t data; size_t i; + long long int now = time_msec(); + long long int stop_time = now + 1000; for (i = 0; i < ATOMIC_ITEM_COUNT; i++) { /* Wait for the reader to be done with the data. */ do { atomic_read_explicit(&aux->data64, &data, memory_order_acquire); - } while (data); + } while (data && (now = time_msec()) < stop_time); + + if (now >= stop_time) { + if (i < 10) { + VLOG_INFO("atomic_writer test stopped due to excessive " + "runtime, Count = %"PRIuSIZE, i); + } + break; + } a = i + 1; atomic_add_explicit(&aux->count, 1, &old_count, memory_order_relaxed); -- 1.7.10.4 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev