diff options
author | teor <teor@torproject.org> | 2019-03-14 06:35:05 +1000 |
---|---|---|
committer | teor <teor@torproject.org> | 2019-03-14 06:35:05 +1000 |
commit | 9daae1b302abb8c0e75773738cb4f55d88ff6b1d (patch) | |
tree | 49f2baa761383183e63538f9f7969391a83f3f1d | |
parent | 2e74edb53ef9ac417d8424a0785af839f83791ca (diff) | |
parent | 7a0ff5beb21e6485bda44c0545036bb2883f643d (diff) | |
download | tor-9daae1b302abb8c0e75773738cb4f55d88ff6b1d.tar.gz tor-9daae1b302abb8c0e75773738cb4f55d88ff6b1d.zip |
Merge remote-tracking branch 'tor-github/pr/331' into maint-0.2.9
-rw-r--r-- | changes/bug27073 | 4 | ||||
-rw-r--r-- | src/test/test_threads.c | 30 |
2 files changed, 23 insertions, 11 deletions
diff --git a/changes/bug27073 b/changes/bug27073 new file mode 100644 index 0000000000..851e7f0df6 --- /dev/null +++ b/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. diff --git a/src/test/test_threads.c b/src/test/test_threads.c index ebbc95c7ca..448ab2034b 100644 --- a/src/test/test_threads.c +++ b/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, ==, 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, ==, 2); tt_int_op(ti->n_timeouts, ==, 2); tor_mutex_release(ti->mutex); @@ -301,4 +310,3 @@ struct testcase_t thread_tests[] = { &passthrough_setup, (void*)"tv" }, END_OF_TESTCASES }; - |