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:
parent
171a570f38
commit
f8a51034bd
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue