[lttng-dev] [PATCH urcu v2] Fix: pthread_rwlock initialization on Cygwin
Michael Jeanson
mjeanson at efficios.com
Fri Nov 23 16:47:18 EST 2018
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 <mjeanson at efficios.com>
---
tests/benchmark/test_rwlock.c | 42 ++++++++++++++++++++++++----
tests/benchmark/test_rwlock_timing.c | 33 +++++++++++++++++-----
2 files changed, 62 insertions(+), 13 deletions(-)
diff --git a/tests/benchmark/test_rwlock.c b/tests/benchmark/test_rwlock.c
index 4448597..76beb12 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,25 @@ 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));
+ abort();
+ }
- 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));
+ abort();
+ }
+
URCU_TLS(nr_reads)++;
if (caa_unlikely(!test_duration_read()))
break;
@@ -208,12 +219,25 @@ 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));
+ abort();
+ }
+
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));
+ abort();
+ }
+
URCU_TLS(nr_writes)++;
if (caa_unlikely(!test_duration_write()))
break;
@@ -321,6 +345,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);
+ }
+
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
More information about the lttng-dev
mailing list