225 lines
6.1 KiB
Diff
225 lines
6.1 KiB
Diff
From eec2f6a5c353f28bb74e4a3f96a3da5a50f25574 Mon Sep 17 00:00:00 2001
|
|
From: Michael Jeanson <mjeanson@efficios.com>
|
|
Date: Fri, 23 Nov 2018 16:47:18 -0500
|
|
Subject: [PATCH 02/15] Fix: pthread_rwlock initialization on Cygwin
|
|
|
|
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@efficios.com>
|
|
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
|
|
---
|
|
tests/benchmark/test_rwlock.c | 51 ++++++++++++++++++++++++----
|
|
tests/benchmark/test_rwlock_timing.c | 50 +++++++++++++++++++++++----
|
|
2 files changed, 88 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/tests/benchmark/test_rwlock.c b/tests/benchmark/test_rwlock.c
|
|
index 4448597..f95e4e1 100644
|
|
--- a/tests/benchmark/test_rwlock.c
|
|
+++ b/tests/benchmark/test_rwlock.c
|
|
@@ -48,7 +48,11 @@ struct test_array {
|
|
int a;
|
|
};
|
|
|
|
-pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
|
|
+/*
|
|
+ * static rwlock initializer is broken on Cygwin. Use runtime
|
|
+ * initialization.
|
|
+ */
|
|
+pthread_rwlock_t lock;
|
|
|
|
static volatile int test_go, test_stop;
|
|
|
|
@@ -173,14 +177,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 +223,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 +349,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));
|
|
@@ -371,6 +405,11 @@ int main(int argc, char **argv)
|
|
nr_writers, wdelay, tot_reads, tot_writes,
|
|
tot_reads + tot_writes);
|
|
|
|
+ err = pthread_rwlock_destroy(&lock);
|
|
+ if (err != 0) {
|
|
+ fprintf(stderr, "pthread_rwlock_destroy: (%d) %s\n", err, strerror(err));
|
|
+ exit(1);
|
|
+ }
|
|
free(tid_reader);
|
|
free(tid_writer);
|
|
free(count_reader);
|
|
diff --git a/tests/benchmark/test_rwlock_timing.c b/tests/benchmark/test_rwlock_timing.c
|
|
index a52da38..bc51c45 100644
|
|
--- a/tests/benchmark/test_rwlock_timing.c
|
|
+++ b/tests/benchmark/test_rwlock_timing.c
|
|
@@ -42,7 +42,11 @@ struct test_array {
|
|
int a;
|
|
};
|
|
|
|
-pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
|
|
+/*
|
|
+ * static rwlock initializer is broken on Cygwin. Use runtime
|
|
+ * initialization.
|
|
+ */
|
|
+pthread_rwlock_t lock;
|
|
|
|
static struct test_array test_array = { 8 };
|
|
|
|
@@ -65,7 +69,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 +79,19 @@ 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));
|
|
+ abort();
|
|
+ }
|
|
+
|
|
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));
|
|
+ abort();
|
|
+ }
|
|
}
|
|
}
|
|
time2 = caa_get_cycles();
|
|
@@ -93,7 +107,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 +117,20 @@ 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));
|
|
+ abort();
|
|
+ }
|
|
+
|
|
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));
|
|
+ abort();
|
|
+ }
|
|
+
|
|
time2 = caa_get_cycles();
|
|
writer_time[(unsigned long)arg] += time2 - time1;
|
|
usleep(1);
|
|
@@ -133,6 +158,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));
|
|
@@ -173,6 +204,11 @@ int main(int argc, char **argv)
|
|
printf("Time per write : %g cycles\n",
|
|
(double)tot_wtime / ((double)NR_WRITE * (double)WRITE_LOOP));
|
|
|
|
+ err = pthread_rwlock_destroy(&lock);
|
|
+ if (err != 0) {
|
|
+ fprintf(stderr, "pthread_rwlock_destroy: (%d) %s\n", err, strerror(err));
|
|
+ exit(1);
|
|
+ }
|
|
free(reader_time);
|
|
free(writer_time);
|
|
free(tid_reader);
|
|
--
|
|
2.19.1
|
|
|