From f8a51034bded97c9ccf483dd51e7acda373fe1d1 Mon Sep 17 00:00:00 2001 From: Jose Fonseca Date: Wed, 13 Apr 2016 13:28:36 +0100 Subject: test/unit: Make pipe_barrier_test actually check correct bahavior. So it can run unattended. Also make it silent by default. Reviewed-by: Roland Scheidegger --- src/gallium/tests/unit/pipe_barrier_test.c | 57 ++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 7 deletions(-) (limited to 'src/gallium/tests/unit/pipe_barrier_test.c') diff --git a/src/gallium/tests/unit/pipe_barrier_test.c b/src/gallium/tests/unit/pipe_barrier_test.c index bab6acadb80..bb7989a79fd 100644 --- a/src/gallium/tests/unit/pipe_barrier_test.c +++ b/src/gallium/tests/unit/pipe_barrier_test.c @@ -35,37 +35,78 @@ #include +#include #include "os/os_thread.h" #include "os/os_time.h" +#include "util/u_atomic.h" #define NUM_THREADS 10 +static int verbosity = 0; + static pipe_thread threads[NUM_THREADS]; static pipe_barrier barrier; static int thread_ids[NUM_THREADS]; +static volatile int waiting = 0; +static volatile int proceeded = 0; + + +#define LOG(fmt, ...) \ + if (verbosity > 0) { \ + fprintf(stdout, fmt, ##__VA_ARGS__); \ + } + +#define CHECK(_cond) \ + if (!(_cond)) { \ + fprintf(stderr, "%s:%u: `%s` failed\n", __FILE__, __LINE__, #_cond); \ + _exit(EXIT_FAILURE); \ + } + static PIPE_THREAD_ROUTINE(thread_function, thread_data) { int thread_id = *((int *) thread_data); - printf("thread %d starting\n", thread_id); - os_time_sleep(thread_id * 1000 * 1000); - printf("thread %d before barrier\n", thread_id); + LOG("thread %d starting\n", thread_id); + os_time_sleep(thread_id * 100 * 1000); + LOG("thread %d before barrier\n", thread_id); + + CHECK(p_atomic_read(&proceeded) == 0); + p_atomic_inc(&waiting); + pipe_barrier_wait(&barrier); - printf("thread %d exiting\n", thread_id); + + CHECK(p_atomic_read(&waiting) == NUM_THREADS); + + p_atomic_inc(&proceeded); + + LOG("thread %d exiting\n", thread_id); return 0; } -int main() +int main(int argc, char *argv[]) { int i; - printf("pipe_barrier_test starting\n"); + for (i = 1; i < argc; ++i) { + const char *arg = argv[i]; + if (strcmp(arg, "-v") == 0) { + ++verbosity; + } else { + fprintf(stderr, "error: unrecognized option `%s`\n", arg); + exit(EXIT_FAILURE); + } + } + + // Disable buffering + setbuf(stdout, NULL); + + LOG("pipe_barrier_test starting\n"); pipe_barrier_init(&barrier, NUM_THREADS); @@ -78,9 +119,11 @@ int main() pipe_thread_wait(threads[i]); } + CHECK(p_atomic_read(&proceeded) == NUM_THREADS); + pipe_barrier_destroy(&barrier); - printf("pipe_barrier_test exiting\n"); + LOG("pipe_barrier_test exiting\n"); return 0; } -- cgit v1.2.3