test: make barrier test more rigorous
A correct barriers implementation blocks in uv_barrier_destroy() until the last thread returns from uv_barrier_wait() so make the test more rigorous by destroying the barrier straight away instead of first joining the worker thread. Signed-off-by: Fedor Indutny <fedor@indutny.com>
This commit is contained in:
parent
b64c359557
commit
6c6c922167
@ -41,6 +41,10 @@ static void worker(void* arg) {
|
||||
uv_sleep(c->delay);
|
||||
|
||||
c->worker_barrier_wait_rval = uv_barrier_wait(&c->barrier);
|
||||
if (c->worker_barrier_wait_rval == 1) {
|
||||
uv_barrier_destroy(&c->barrier);
|
||||
ASSERT(c->main_barrier_wait_rval == 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -49,16 +53,21 @@ TEST_IMPL(barrier_1) {
|
||||
worker_config wc;
|
||||
|
||||
memset(&wc, 0, sizeof(wc));
|
||||
wc.main_barrier_wait_rval = -1;
|
||||
wc.worker_barrier_wait_rval = -1;
|
||||
|
||||
ASSERT(0 == uv_barrier_init(&wc.barrier, 2));
|
||||
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
|
||||
|
||||
uv_sleep(100);
|
||||
|
||||
wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier);
|
||||
if (wc.main_barrier_wait_rval == 1) {
|
||||
uv_barrier_destroy(&wc.barrier);
|
||||
ASSERT(wc.worker_barrier_wait_rval == 0);
|
||||
}
|
||||
|
||||
ASSERT(0 == uv_thread_join(&thread));
|
||||
uv_barrier_destroy(&wc.barrier);
|
||||
|
||||
ASSERT(1 == (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval));
|
||||
|
||||
return 0;
|
||||
@ -71,15 +80,19 @@ TEST_IMPL(barrier_2) {
|
||||
|
||||
memset(&wc, 0, sizeof(wc));
|
||||
wc.delay = 100;
|
||||
wc.main_barrier_wait_rval = -1;
|
||||
wc.worker_barrier_wait_rval = -1;
|
||||
|
||||
ASSERT(0 == uv_barrier_init(&wc.barrier, 2));
|
||||
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
|
||||
|
||||
wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier);
|
||||
if (wc.main_barrier_wait_rval == 1) {
|
||||
uv_barrier_destroy(&wc.barrier);
|
||||
ASSERT(wc.worker_barrier_wait_rval == 0);
|
||||
}
|
||||
|
||||
ASSERT(0 == uv_thread_join(&thread));
|
||||
uv_barrier_destroy(&wc.barrier);
|
||||
|
||||
ASSERT(1 == (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval));
|
||||
|
||||
return 0;
|
||||
@ -91,15 +104,19 @@ TEST_IMPL(barrier_3) {
|
||||
worker_config wc;
|
||||
|
||||
memset(&wc, 0, sizeof(wc));
|
||||
wc.main_barrier_wait_rval = -1;
|
||||
wc.worker_barrier_wait_rval = -1;
|
||||
|
||||
ASSERT(0 == uv_barrier_init(&wc.barrier, 2));
|
||||
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
|
||||
|
||||
wc.main_barrier_wait_rval = uv_barrier_wait(&wc.barrier);
|
||||
if (wc.main_barrier_wait_rval == 1) {
|
||||
uv_barrier_destroy(&wc.barrier);
|
||||
ASSERT(wc.worker_barrier_wait_rval == 0);
|
||||
}
|
||||
|
||||
ASSERT(0 == uv_thread_join(&thread));
|
||||
uv_barrier_destroy(&wc.barrier);
|
||||
|
||||
ASSERT(1 == (wc.main_barrier_wait_rval ^ wc.worker_barrier_wait_rval));
|
||||
|
||||
return 0;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user