On 2018-11-23 3:46 p.m., Mathieu Desnoyers wrote: > ----- On Nov 23, 2018, at 3:27 PM, Michael Jeanson mjean...@efficios.com > wrote: > >> On Cygwin the PTHREAD_RWLOCK_INITIALIZER macro is not >> sufficient to get a properly initialized pthread_rwlock_t >> struct. Use the pthread_rwlock_init function instead which >> should work on all platforms. >> >> Signed-off-by: Michael Jeanson <mjean...@efficios.com> >> --- >> tests/benchmark/test_rwlock.c | 34 +++++++++++++++++++++++----- >> tests/benchmark/test_rwlock_timing.c | 33 +++++++++++++++++++++------ >> 2 files changed, 54 insertions(+), 13 deletions(-) >> >> diff --git a/tests/benchmark/test_rwlock.c b/tests/benchmark/test_rwlock.c >> index 4448597..c23e782 100644 >> --- a/tests/benchmark/test_rwlock.c >> +++ b/tests/benchmark/test_rwlock.c >> @@ -48,7 +48,7 @@ struct test_array { >> int a; >> }; >> >> -pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER; >> +pthread_rwlock_t lock; >> >> static volatile int test_go, test_stop; >> >> @@ -173,14 +173,21 @@ void *thr_reader(void *_count) >> } >> >> for (;;) { >> - int a; >> + int a, ret; >> + >> + ret = pthread_rwlock_rdlock(&lock); >> + if (ret) >> + fprintf(stderr, "reader pthread_rwlock_rdlock: %s\n", >> strerror(ret)); > > In each of those cases, shouldn't we also "abort()" ?
Yes, that would make sense. > >> >> - pthread_rwlock_rdlock(&lock); >> a = test_array.a; >> assert(a == 8); >> if (caa_unlikely(rduration)) >> loop_sleep(rduration); >> - pthread_rwlock_unlock(&lock); >> + >> + ret = pthread_rwlock_unlock(&lock); >> + if (ret) >> + fprintf(stderr, "reader pthread_rwlock_unlock: %s\n", >> strerror(ret)); >> + >> URCU_TLS(nr_reads)++; >> if (caa_unlikely(!test_duration_read())) >> break; >> @@ -208,12 +215,21 @@ void *thr_writer(void *_count) >> cmm_smp_mb(); >> >> for (;;) { >> - pthread_rwlock_wrlock(&lock); >> + int ret; >> + >> + ret = pthread_rwlock_wrlock(&lock); >> + if (ret) >> + fprintf(stderr, "writer pthread_rwlock_wrlock: %s\n", >> strerror(ret)); >> + >> test_array.a = 0; >> test_array.a = 8; >> if (caa_unlikely(wduration)) >> loop_sleep(wduration); >> - pthread_rwlock_unlock(&lock); >> + >> + ret = pthread_rwlock_unlock(&lock); >> + if (ret) >> + fprintf(stderr, "writer pthread_rwlock_unlock: %s\n", >> strerror(ret)); >> + >> URCU_TLS(nr_writes)++; >> if (caa_unlikely(!test_duration_write())) >> break; >> @@ -321,6 +337,12 @@ int main(int argc, char **argv) >> printf_verbose("thread %-6s, tid %lu\n", >> "main", urcu_get_thread_id()); >> >> + err = pthread_rwlock_init(&lock, NULL); >> + if (err != 0) { >> + fprintf(stderr, "pthread_rwlock_init: (%d) %s\n", err, >> strerror(err)); >> + exit(1); >> + } >> + >> tid_reader = calloc(nr_readers, sizeof(*tid_reader)); >> tid_writer = calloc(nr_writers, sizeof(*tid_writer)); >> count_reader = calloc(nr_readers, sizeof(*count_reader)); >> diff --git a/tests/benchmark/test_rwlock_timing.c >> b/tests/benchmark/test_rwlock_timing.c >> index a52da38..1e7863a 100644 >> --- a/tests/benchmark/test_rwlock_timing.c >> +++ b/tests/benchmark/test_rwlock_timing.c >> @@ -42,7 +42,7 @@ struct test_array { >> int a; >> }; >> >> -pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER; >> +pthread_rwlock_t lock; >> >> static struct test_array test_array = { 8 }; >> >> @@ -65,7 +65,7 @@ static caa_cycles_t >> __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time; >> >> void *thr_reader(void *arg) >> { >> - int i, j; >> + int i, j, ret; >> caa_cycles_t time1, time2; >> >> printf("thread_begin %s, tid %lu\n", >> @@ -75,9 +75,15 @@ void *thr_reader(void *arg) >> time1 = caa_get_cycles(); >> for (i = 0; i < OUTER_READ_LOOP; i++) { >> for (j = 0; j < INNER_READ_LOOP; j++) { >> - pthread_rwlock_rdlock(&lock); >> + ret = pthread_rwlock_rdlock(&lock); >> + if (ret) >> + fprintf(stderr, "reader pthread_rwlock_rdlock: >> %s\n", strerror(ret)); >> + >> assert(test_array.a == 8); >> - pthread_rwlock_unlock(&lock); >> + >> + ret = pthread_rwlock_unlock(&lock); >> + if (ret) >> + fprintf(stderr, "reader pthread_rwlock_unlock: >> %s\n", strerror(ret)); >> } >> } >> time2 = caa_get_cycles(); >> @@ -93,7 +99,7 @@ void *thr_reader(void *arg) >> >> void *thr_writer(void *arg) >> { >> - int i, j; >> + int i, j, ret; >> caa_cycles_t time1, time2; >> >> printf("thread_begin %s, tid %lu\n", >> @@ -103,9 +109,16 @@ void *thr_writer(void *arg) >> for (i = 0; i < OUTER_WRITE_LOOP; i++) { >> for (j = 0; j < INNER_WRITE_LOOP; j++) { >> time1 = caa_get_cycles(); >> - pthread_rwlock_wrlock(&lock); >> + ret = pthread_rwlock_wrlock(&lock); >> + if (ret) >> + fprintf(stderr, "writer pthread_rwlock_wrlock: >> %s\n", strerror(ret)); >> + >> test_array.a = 8; >> - pthread_rwlock_unlock(&lock); >> + >> + ret = pthread_rwlock_unlock(&lock); >> + if (ret) >> + fprintf(stderr, "writer pthread_rwlock_unlock: >> %s\n", strerror(ret)); >> + >> time2 = caa_get_cycles(); >> writer_time[(unsigned long)arg] += time2 - time1; >> usleep(1); >> @@ -133,6 +146,12 @@ int main(int argc, char **argv) >> num_read = atoi(argv[1]); >> num_write = atoi(argv[2]); >> >> + err = pthread_rwlock_init(&lock, NULL); >> + if (err != 0) { >> + fprintf(stderr, "pthread_rwlock_init: (%d) %s\n", err, >> strerror(err)); >> + exit(1); > > I typically use "abort()" instead. exit() is used everywhere in this file to abort, I went with the "local" style. > > Thanks, > > Mathieu > > >> + } >> + >> reader_time = calloc(num_read, sizeof(*reader_time)); >> writer_time = calloc(num_write, sizeof(*writer_time)); >> tid_reader = calloc(num_read, sizeof(*tid_reader)); >> -- >> 2.17.1 > _______________________________________________ lttng-dev mailing list lttng-dev@lists.lttng.org https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev