Browse Source

Merge remote-tracking branch 'github/bug27073_029'

Nick Mathewson 5 years ago
parent
commit
4199c8b2d0
2 changed files with 23 additions and 11 deletions
  1. 4 0
      changes/bug27073
  2. 19 11
      src/test/test_threads.c

+ 4 - 0
changes/bug27073

@@ -0,0 +1,4 @@
+  o Minor bugfixes (testing):
+    - Revise the "conditionvar_timeout" test so that it succeeds even
+      on heavily loaded systems where the test threads are not scheduled
+      within 200 msec. Fixes bug 27073; bugfix on 0.2.6.3-alpha.

+ 19 - 11
src/test/test_threads.c

@@ -234,25 +234,33 @@ test_threads_conditionvar(void *arg)
   if (timeout) {
     ti->tv = &msec100;
   }
+
+#define SPIN_UNTIL(condition,sleep_msec)        \
+  while (1) {                                   \
+    tor_mutex_acquire(ti->mutex);               \
+    if (condition) {                            \
+      break;                                    \
+    }                                           \
+    tor_mutex_release(ti->mutex);               \
+    tor_sleep_msec(sleep_msec);                 \
+  }
+
   spawn_func(cv_test_thr_fn_, ti);
   spawn_func(cv_test_thr_fn_, ti);
   spawn_func(cv_test_thr_fn_, ti);
   spawn_func(cv_test_thr_fn_, ti);
 
-  tor_mutex_acquire(ti->mutex);
+  SPIN_UNTIL(ti->n_threads == 4, 10);
+
+  time_t started_at = time(NULL);
+
   ti->addend = 7;
   ti->shutdown = 1;
   tor_cond_signal_one(ti->cond);
   tor_mutex_release(ti->mutex);
 
 #define SPIN()                                  \
-  while (1) {                                   \
-    tor_mutex_acquire(ti->mutex);               \
-    if (ti->addend == 0) {                      \
-      break;                                    \
-    }                                           \
-    tor_mutex_release(ti->mutex);               \
-  }
+  SPIN_UNTIL(ti->addend == 0, 0)
 
   SPIN();
 
@@ -279,8 +287,9 @@ test_threads_conditionvar(void *arg)
   if (!timeout) {
     tt_int_op(ti->n_shutdown, OP_EQ, 4);
   } else {
-    tor_sleep_msec(200);
-    tor_mutex_acquire(ti->mutex);
+    const int GIVE_UP_AFTER_SEC = 30;
+    SPIN_UNTIL((ti->n_timeouts == 2 ||
+                time(NULL) >= started_at + GIVE_UP_AFTER_SEC), 10);
     tt_int_op(ti->n_shutdown, OP_EQ, 2);
     tt_int_op(ti->n_timeouts, OP_EQ, 2);
     tor_mutex_release(ti->mutex);
@@ -301,4 +310,3 @@ struct testcase_t thread_tests[] = {
     &passthrough_setup, (void*)"tv" },
   END_OF_TESTCASES
 };
-