X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=test_qsbr.c;h=82521efcf83a9babbf743f7741ad05a473efabb6;hb=59d5a40624428364374c306409979155beddfaac;hp=3d906cc4bc54d39f503b6bd4ae1f2082a05aff8e;hpb=7685d9639221a1dc5c0eeba54a60d633618b242a;p=urcu.git diff --git a/test_qsbr.c b/test_qsbr.c index 3d906cc..82521ef 100644 --- a/test_qsbr.c +++ b/test_qsbr.c @@ -55,39 +55,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; @@ -178,9 +164,10 @@ void *thr_reader(void *_count) assert(local_ptr->a == 8); _rcu_read_unlock(); nr_reads++; - if (duration_interval >= DURATION_TEST_DELAY_READ - 1) + /* QS each 1024 reads */ + if (unlikely((nr_reads & ((1 << 10) - 1)) == 0)) _rcu_quiescent_state(); - if (!test_duration_read()) + if (unlikely(!test_duration_read())) break; } @@ -220,9 +207,9 @@ void *thr_writer(void *_count) old->a = 0; test_array_free(old); nr_writes++; - if (!test_duration_write()) + if (unlikely(!test_duration_write())) break; - if (wdelay) + if (unlikely(wdelay)) usleep(wdelay); } @@ -321,10 +308,14 @@ int main(int argc, char **argv) exit(1); } - start_time = time(NULL); - test_go = 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)