X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=test_urcu.c;h=d300610e049dc907147228e40d1c2b34245942b4;hb=3395d46cc4ab83f9c23ecc5410122111cce5905d;hp=4dfe2182860a41e497bf9fef36749f2382dc7bfa;hpb=8c86b9a193ba4b6a6a77443a7da693530716dff1;p=urcu.git diff --git a/test_urcu.c b/test_urcu.c index 4dfe218..d300610 100644 --- a/test_urcu.c +++ b/test_urcu.c @@ -31,6 +31,8 @@ #include #include +#include "arch.h" + #if defined(_syscall0) _syscall0(pid_t, gettid) #elif defined(__NR_gettid) @@ -57,39 +59,25 @@ struct test_array { int a; }; -static volatile int test_go; +static volatile int test_go, test_stop; static int wdelay; static struct test_array *test_rcu_pointer; static unsigned long duration; -static time_t start_time; -static unsigned long __thread duration_interval; -#define DURATION_TEST_DELAY_WRITE 4 -#define DURATION_TEST_DELAY_READ 100 /* * returns 0 if test should end. */ static int test_duration_write(void) { - if (duration_interval++ >= DURATION_TEST_DELAY_WRITE) { - duration_interval = 0; - if (time(NULL) - start_time >= duration) - return 0; - } - return 1; + return !test_stop; } static int test_duration_read(void) { - if (duration_interval++ >= DURATION_TEST_DELAY_READ) { - duration_interval = 0; - if (time(NULL) - start_time >= duration) - return 0; - } - return 1; + return !test_stop; } static unsigned long long __thread nr_writes; @@ -170,6 +158,7 @@ void *thr_reader(void *_count) while (!test_go) { } + smp_mb(); for (;;) { rcu_read_lock(); @@ -203,6 +192,7 @@ void *thr_writer(void *_count) while (!test_go) { } + smp_mb(); for (;;) { new = test_array_alloc(); @@ -236,7 +226,7 @@ void show_usage(int argc, char **argv) #ifdef DEBUG_YIELD printf(" [-r] [-w] (yield reader and/or writer)"); #endif - printf(" [-d delay] (writer period)"); + printf(" [-d delay] (writer period (us))"); printf("\n"); } @@ -285,7 +275,7 @@ int main(int argc, char **argv) break; #endif case 'd': - if (argc < i + 1) { + if (argc < i + 2) { show_usage(argc, argv); return -1; } @@ -297,7 +287,6 @@ int main(int argc, char **argv) printf("running test for %lu seconds, %u readers, %u writers.\n", duration, nr_readers, nr_writers); printf("Writer delay : %u us.\n", wdelay); - start_time = time(NULL); printf("thread %-6s, thread id : %lx, tid %lu\n", "main", pthread_self(), (unsigned long)gettid()); @@ -320,8 +309,14 @@ int main(int argc, char **argv) exit(1); } + smp_mb(); + test_go = 1; + sleep(duration); + + test_stop = 1; + for (i = 0; i < nr_readers; i++) { err = pthread_join(tid_reader[i], &tret); if (err != 0)