X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust-libc-wrapper%2Flttng-ust-malloc.c;h=f30a2c694372970c7f68581364075a67534dbeb4;hb=553bbf7f38652084ed7966c7817b8ccb372b14e1;hp=d1ad3cf5b146260cf93548df5bf2a41ae9358057;hpb=171fcc6fd03e3f5787b3d0ee8aedc8cb9bcc6f17;p=lttng-ust.git diff --git a/liblttng-ust-libc-wrapper/lttng-ust-malloc.c b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c index d1ad3cf5..f30a2c69 100644 --- a/liblttng-ust-libc-wrapper/lttng-ust-malloc.c +++ b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c @@ -18,6 +18,11 @@ */ #define _GNU_SOURCE +/* + * Do _not_ define _LGPL_SOURCE because we don't want to create a + * circular dependency loop between this malloc wrapper, liburcu and + * libc. + */ #include #include #include @@ -90,7 +95,7 @@ void ust_malloc_spin_unlock(pthread_mutex_t *lock) #define calloc static_calloc #define pthread_mutex_lock ust_malloc_spin_lock #define pthread_mutex_unlock ust_malloc_spin_unlock -static DEFINE_URCU_TLS(int, malloc_nesting); +static DEFINE_URCU_TLS_IE(int, malloc_nesting); #undef ust_malloc_spin_unlock #undef ust_malloc_spin_lock #undef calloc @@ -416,6 +421,12 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) return retval; } +static +void lttng_ust_fixup_malloc_nesting_tls(void) +{ + asm volatile ("" : : "m" (URCU_TLS(malloc_nesting))); +} + __attribute__((constructor)) void lttng_ust_malloc_wrapper_init(void) { @@ -423,6 +434,7 @@ void lttng_ust_malloc_wrapper_init(void) if (cur_alloc.calloc) { return; } + lttng_ust_fixup_malloc_nesting_tls(); /* * Ensure the allocator is in place before the process becomes * multithreaded.