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

Reply via email to