From 6c6c9221679c6cc66ac30fbad5ce086658113ea3 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 2 Jun 2014 19:01:47 +0200 Subject: [PATCH] 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 --- test/test-barrier.c | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/test/test-barrier.c b/test/test-barrier.c index dfd2dbde..25a55d6c 100644 --- a/test/test-barrier.c +++ b/test/test-barrier.c @@ -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;