From: Michael Jeanson Date: Thu, 18 Nov 2021 20:08:53 +0000 (-0500) Subject: fix: use urcu-tls compat with c++ compiler X-Git-Tag: v0.14.0~42 X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=69fbb39e88b9ac568f0bdbf384932a0cc5c58a02 fix: use urcu-tls compat with c++ compiler * 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 Signed-off-by: Mathieu Desnoyers --- diff --git a/include/urcu/tls-compat.h b/include/urcu/tls-compat.h index a2c94de..431319d 100644 --- a/include/urcu/tls-compat.h +++ b/include/urcu/tls-compat.h @@ -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); \ diff --git a/tests/unit/test_build.c b/tests/unit/test_build.c index b2786c5..7f062f1 100644 --- a/tests/unit/test_build.c +++ b/tests/unit/test_build.c @@ -59,6 +59,15 @@ #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(); }