X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=src%2Flib%2Flttng-ust-libc-wrapper%2Flttng-ust-malloc.c;h=2212cb06d850b65582af01a3471bc93f7a52467d;hb=49400d96e137c653092cf42177decbd7573fcfcf;hp=d51c5ab3ee3631c9a2cdfb0a89427d06b2844e14;hpb=660323e630e752c98bf6124d54ff99777d05ce7d;p=lttng-ust.git diff --git a/src/lib/lttng-ust-libc-wrapper/lttng-ust-malloc.c b/src/lib/lttng-ust-libc-wrapper/lttng-ust-malloc.c index d51c5ab3..2212cb06 100644 --- a/src/lib/lttng-ust-libc-wrapper/lttng-ust-malloc.c +++ b/src/lib/lttng-ust-libc-wrapper/lttng-ust-malloc.c @@ -22,7 +22,6 @@ #include #include #include -#include #include #include @@ -30,9 +29,12 @@ #include "common/macros.h" #include "common/align.h" +#define LTTNG_UST_TRACEPOINT_HIDDEN_DEFINITION +#define LTTNG_UST_TRACEPOINT_PROVIDER_HIDDEN_DEFINITION + #define LTTNG_UST_TRACEPOINT_DEFINE #define LTTNG_UST_TRACEPOINT_CREATE_PROBES -#define TP_IP_PARAM ip +#define LTTNG_UST_TP_IP_PARAM ip #include "ust_libc.h" #define STATIC_CALLOC_LEN 4096 @@ -93,13 +95,13 @@ void ust_malloc_spin_unlock(pthread_mutex_t *lock __attribute__((unused))) uatomic_set(&ust_malloc_lock, 0); } -#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); -#undef pthread_mutex_unlock -#undef pthread_mutex_lock -#undef calloc +/* + * Use initial-exec TLS model for the malloc_nesting nesting guard + * variable to ensure that the glibc implementation of the TLS access + * don't trigger infinite recursion by calling the memory allocator + * wrapper functions, which could happen with global-dynamic. + */ +static __thread __attribute__((tls_model("initial-exec"))) int malloc_nesting; /* * Static allocator to use when initially executing dlsym(). It keeps a @@ -258,7 +260,7 @@ void *malloc(size_t size) { void *retval; - URCU_TLS(malloc_nesting)++; + malloc_nesting++; if (cur_alloc.malloc == NULL) { lookup_all_symbols(); if (cur_alloc.malloc == NULL) { @@ -267,17 +269,17 @@ void *malloc(size_t size) } } retval = cur_alloc.malloc(size); - if (URCU_TLS(malloc_nesting) == 1) { + if (malloc_nesting == 1) { lttng_ust_tracepoint(lttng_ust_libc, malloc, size, retval, LTTNG_UST_CALLER_IP()); } - URCU_TLS(malloc_nesting)--; + malloc_nesting--; return retval; } void free(void *ptr) { - URCU_TLS(malloc_nesting)++; + malloc_nesting++; /* * Check whether the memory was allocated with * static_calloc_align, in which case there is nothing to free. @@ -287,7 +289,7 @@ void free(void *ptr) goto end; } - if (URCU_TLS(malloc_nesting) == 1) { + if (malloc_nesting == 1) { lttng_ust_tracepoint(lttng_ust_libc, free, ptr, LTTNG_UST_CALLER_IP()); } @@ -301,14 +303,14 @@ void free(void *ptr) } cur_alloc.free(ptr); end: - URCU_TLS(malloc_nesting)--; + malloc_nesting--; } void *calloc(size_t nmemb, size_t size) { void *retval; - URCU_TLS(malloc_nesting)++; + malloc_nesting++; if (cur_alloc.calloc == NULL) { lookup_all_symbols(); if (cur_alloc.calloc == NULL) { @@ -317,11 +319,11 @@ void *calloc(size_t nmemb, size_t size) } } retval = cur_alloc.calloc(nmemb, size); - if (URCU_TLS(malloc_nesting) == 1) { + if (malloc_nesting == 1) { lttng_ust_tracepoint(lttng_ust_libc, calloc, nmemb, size, retval, LTTNG_UST_CALLER_IP()); } - URCU_TLS(malloc_nesting)--; + malloc_nesting--; return retval; } @@ -329,7 +331,7 @@ void *realloc(void *ptr, size_t size) { void *retval; - URCU_TLS(malloc_nesting)++; + malloc_nesting++; /* * Check whether the memory was allocated with * static_calloc_align, in which case there is nothing @@ -352,7 +354,7 @@ void *realloc(void *ptr, size_t size) memcpy(retval, ptr, *old_size); } /* - * Mimick that a NULL pointer has been received, so + * Mimic that a NULL pointer has been received, so * memory allocation analysis based on the trace don't * get confused by the address from the static * allocator. @@ -370,11 +372,11 @@ void *realloc(void *ptr, size_t size) } retval = cur_alloc.realloc(ptr, size); end: - if (URCU_TLS(malloc_nesting) == 1) { + if (malloc_nesting == 1) { lttng_ust_tracepoint(lttng_ust_libc, realloc, ptr, size, retval, LTTNG_UST_CALLER_IP()); } - URCU_TLS(malloc_nesting)--; + malloc_nesting--; return retval; } @@ -382,7 +384,7 @@ void *memalign(size_t alignment, size_t size) { void *retval; - URCU_TLS(malloc_nesting)++; + malloc_nesting++; if (cur_alloc.memalign == NULL) { lookup_all_symbols(); if (cur_alloc.memalign == NULL) { @@ -391,12 +393,12 @@ void *memalign(size_t alignment, size_t size) } } retval = cur_alloc.memalign(alignment, size); - if (URCU_TLS(malloc_nesting) == 1) { + if (malloc_nesting == 1) { lttng_ust_tracepoint(lttng_ust_libc, memalign, alignment, size, retval, LTTNG_UST_CALLER_IP()); } - URCU_TLS(malloc_nesting)--; + malloc_nesting--; return retval; } @@ -404,7 +406,7 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) { int retval; - URCU_TLS(malloc_nesting)++; + malloc_nesting++; if (cur_alloc.posix_memalign == NULL) { lookup_all_symbols(); if (cur_alloc.posix_memalign == NULL) { @@ -413,28 +415,21 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) } } retval = cur_alloc.posix_memalign(memptr, alignment, size); - if (URCU_TLS(malloc_nesting) == 1) { + if (malloc_nesting == 1) { lttng_ust_tracepoint(lttng_ust_libc, posix_memalign, *memptr, alignment, size, retval, LTTNG_UST_CALLER_IP()); } - URCU_TLS(malloc_nesting)--; + malloc_nesting--; return retval; } -static -void lttng_ust_fixup_malloc_nesting_tls(void) -{ - asm volatile ("" : : "m" (URCU_TLS(malloc_nesting))); -} - void lttng_ust_libc_wrapper_malloc_ctor(void) { /* Initialization already done */ if (cur_alloc.calloc) { return; } - lttng_ust_fixup_malloc_nesting_tls(); /* * Ensure the allocator is in place before the process becomes * multithreaded.