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 <sroland@vmware.com>
This commit is contained in:
Jose Fonseca 2016-04-13 13:28:36 +01:00
parent 171a570f38
commit f8a51034bd
1 changed files with 50 additions and 7 deletions

View File

@ -35,37 +35,78 @@
#include <stdio.h>
#include <stdlib.h>
#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;
}