type *__tls_access_ ## name(void) \
{ \
static struct urcu_tls __tls_ ## name = { \
+ .key = 0, \
.init_mutex = PTHREAD_MUTEX_INITIALIZER,\
.init_done = 0, \
}; \
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); \
#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;
};
}
+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);
test_wfstack();
test_wfcqueue();
test_build_cds_list_head_init();
+ test_urcu_tls();
return exit_status();
}