fix: use urcu-tls compat with c++ compiler
authorMichael Jeanson <mjeanson@efficios.com>
Thu, 18 Nov 2021 20:08:53 +0000 (15:08 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 18 Nov 2021 21:12:06 +0000 (16:12 -0500)
  * Initialize all fields of 'struct urcu_tls' to avoid :

    sorry, unimplemented: non-trivial designated initializers not supported

  * Cast void* to proper type pointers to avoid :

    error: invalid conversion from ‘void*’ to ...

Change-Id: I654f924324cda2eaea723f4a0759d706b2a2bf40
Signed-off-by: Michael Jeanson <mjeanson@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/urcu/tls-compat.h
tests/unit/test_build.c

index a2c94ded9cd9833558bb25d19b9908c6f47a9007..431319d608518af222045f9467dfb8081dfaaa8c 100644 (file)
@@ -116,6 +116,7 @@ struct urcu_tls {
        type *__tls_access_ ## name(void)                       \
        {                                                       \
                static struct urcu_tls __tls_ ## name = {       \
+                       .key = 0,                               \
                        .init_mutex = PTHREAD_MUTEX_INITIALIZER,\
                        .init_done = 0,                         \
                };                                              \
@@ -132,9 +133,9 @@ struct urcu_tls {
                        pthread_mutex_unlock(&__tls_ ## name.init_mutex); \
                }                                               \
                cmm_smp_rmb();  /* read init_done before getting key */ \
-               __tls_p = pthread_getspecific(__tls_ ## name.key); \
+               __tls_p = (__typeof__(type) *) pthread_getspecific(__tls_ ## name.key); \
                if (caa_unlikely(__tls_p == NULL)) {            \
-                       __tls_p = calloc(1, sizeof(type));      \
+                       __tls_p = (__typeof__(type) *) calloc(1, sizeof(type)); \
                        do_init                                 \
                        (void) pthread_setspecific(__tls_ ## name.key,  \
                                __tls_p);                       \
index b2786c55c00253d8d51ab6e1ae8ed90329755f85..7f062f19a236d85f99e1a3402dec9ad467b34582 100644 (file)
 
 #include "tap.h"
 
+struct my_tls_struct {
+       int int1;
+       char char1;
+       void *void1;
+};
+
+static DEFINE_URCU_TLS(int, my_tls_int);
+static DEFINE_URCU_TLS(struct my_tls_struct, my_tls_struct);
+
 static void test_lfstack(void)
 {
        struct cds_lfs_stack s;
@@ -97,6 +106,15 @@ void test_build_cds_list_head_init(void)
        };
 }
 
+static
+void test_urcu_tls(void)
+{
+       URCU_TLS(my_tls_int) = 1;
+       URCU_TLS(my_tls_struct).int1 = 1;
+       URCU_TLS(my_tls_struct).char1 = 'a';
+       URCU_TLS(my_tls_struct).void1 = NULL;
+}
+
 int main(void)
 {
        plan_tests(3);
@@ -105,6 +123,7 @@ int main(void)
        test_wfstack();
        test_wfcqueue();
        test_build_cds_list_head_init();
+       test_urcu_tls();
 
        return exit_status();
 }
This page took 0.026509 seconds and 4 git commands to generate.