[lttng-dev] [PATCH urcu 2/4] Fix: pthread_rwlock initialization on Cygwin

2018-11-23 Thread Michael Jeanson
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 
---
 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));
 
-   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 = pth

[lttng-dev] [PATCH urcu 3/4] Add *.exe to gitignore for Cygwin

2018-11-23 Thread Michael Jeanson
Signed-off-by: Michael Jeanson 
---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitignore b/.gitignore
index d02ed09..4daa824 100644
--- a/.gitignore
+++ b/.gitignore
@@ -76,6 +76,7 @@ tests/benchmark/test_urcu_wfcq_dynlink
 
 tests/benchmark/*.log
 *.so
+*.exe
 
 doc/examples/urcu-flavors/qsbr
 doc/examples/urcu-flavors/mb
-- 
2.17.1

___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


[lttng-dev] [PATCH urcu 1/4] Fix: compat_futex_noasync on Cygwin

2018-11-23 Thread Michael Jeanson
The futex_noasync compat code uses a weak symbol to share state across
different shared object which is not possible on Windows with the
 Portable Executable format. Use the async compat code for both cases.

Signed-off-by: Michael Jeanson 
---
 include/urcu/futex.h | 19 +++
 1 file changed, 19 insertions(+)

diff --git a/include/urcu/futex.h b/include/urcu/futex.h
index 0486ff6..753df62 100644
--- a/include/urcu/futex.h
+++ b/include/urcu/futex.h
@@ -102,6 +102,25 @@ static inline int futex_async(int32_t *uaddr, int op, 
int32_t val,
return ret;
 }
 
+#elif defined(__CYGWIN__)
+
+/*
+ * The futex_noasync compat code uses a weak symbol to share state across
+ * different shared object which is not possible on Windows with the
+ * Portable Executable format. Use the async compat code for both cases.
+ */
+static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
+   const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
+{
+   return compat_futex_async(uaddr, op, val, timeout, uaddr2, val3);
+}
+
+static inline int futex_async(int32_t *uaddr, int op, int32_t val,
+   const struct timespec *timeout, int32_t *uaddr2, int32_t val3)
+{
+   return compat_futex_async(uaddr, op, val, timeout, uaddr2, val3);
+}
+
 #else
 
 static inline int futex_noasync(int32_t *uaddr, int op, int32_t val,
-- 
2.17.1

___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


[lttng-dev] [PATCH urcu 4/4] test_rwlock: Add per-thread count to verbose output

2018-11-23 Thread Michael Jeanson
Signed-off-by: Michael Jeanson 
---
 tests/benchmark/test_rwlock.c | 12 +++-
 1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/tests/benchmark/test_rwlock.c b/tests/benchmark/test_rwlock.c
index c23e782..02073f1 100644
--- a/tests/benchmark/test_rwlock.c
+++ b/tests/benchmark/test_rwlock.c
@@ -194,8 +194,9 @@ void *thr_reader(void *_count)
}
 
*count = URCU_TLS(nr_reads);
-   printf_verbose("thread_end %s, tid %lu\n",
-   "reader", urcu_get_thread_id());
+
+   printf_verbose("thread_end %s, tid %lu, count %llu\n",
+   "reader", urcu_get_thread_id(), *count);
return ((void*)1);
 
 }
@@ -236,10 +237,10 @@ void *thr_writer(void *_count)
if (caa_unlikely(wdelay))
loop_sleep(wdelay);
}
-
-   printf_verbose("thread_end %s, tid %lu\n",
-   "writer", urcu_get_thread_id());
*count = URCU_TLS(nr_writes);
+
+   printf_verbose("thread_end %s, tid %lu, count %llu\n",
+   "writer", urcu_get_thread_id(), *count);
return ((void*)2);
 }
 
@@ -333,6 +334,7 @@ int main(int argc, char **argv)
printf_verbose("running test for %lu seconds, %u readers, %u 
writers.\n",
duration, nr_readers, nr_writers);
printf_verbose("Writer delay : %lu loops.\n", wdelay);
+   printf_verbose("Writer duration : %lu loops.\n", wduration);
printf_verbose("Reader duration : %lu loops.\n", rduration);
printf_verbose("thread %-6s, tid %lu\n",
"main", urcu_get_thread_id());
-- 
2.17.1

___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


Re: [lttng-dev] [PATCH urcu 2/4] Fix: pthread_rwlock initialization on Cygwin

2018-11-23 Thread Mathieu Desnoyers
- 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 
> ---
> 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()" ?

> 
> - 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_write

Re: [lttng-dev] [PATCH urcu 2/4] Fix: pthread_rwlock initialization on Cygwin

2018-11-23 Thread Michael Jeanson
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 
>> ---
>> 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

Re: [lttng-dev] [PATCH urcu 2/4] Fix: pthread_rwlock initialization on Cygwin

2018-11-23 Thread Mathieu Desnoyers
- On Nov 23, 2018, at 3:54 PM, Michael Jeanson mjean...@efficios.com wrote:

> On 2018-11-23 3:46 p.m., Mathieu Desnoyers wrote:
[...]
>> I typically use "abort()" instead.
> 
> exit() is used everywhere in this file to abort, I went with the "local"
> style.

Works for me!

Thanks,

Mathieu

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


[lttng-dev] [PATCH urcu v2] Fix: pthread_rwlock initialization on Cygwin

2018-11-23 Thread Michael Jeanson
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 
---
 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_

Re: [lttng-dev] [PATCH urcu v2] Fix: pthread_rwlock initialization on Cygwin

2018-11-23 Thread Mathieu Desnoyers
Merged all 4 patches with some modifications to this patch:

- added missing abort in test_rwlock_timing.c
- added missing pthread_rwlock_destroy.

Thanks,

Mathieu

- On Nov 23, 2018, at 4:47 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 
> ---
> 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