X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=liblttng-ust-libc-wrapper%2Flttng-ust-malloc.c;h=27624a3d821465bb0c1f9ceacfb09489d683f632;hb=refs%2Fheads%2Fstable-2.5;hp=06e0efe8679a4a24d635715f01e1130eb0d1ea20;hpb=8c06ba6ffeeb1196fa96dfbdd0b1c9937496f70f;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 06e0efe8..27624a3d 100644 --- a/liblttng-ust-libc-wrapper/lttng-ust-malloc.c +++ b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c @@ -26,10 +26,12 @@ #include #include #include +#include #include #define TRACEPOINT_DEFINE #define TRACEPOINT_CREATE_PROBES +#define TP_IP_PARAM ip #include "ust_libc.h" #define STATIC_CALLOC_LEN 4096 @@ -56,8 +58,40 @@ struct alloc_functions cur_alloc; static void *static_calloc(size_t nmemb, size_t size); +/* + * pthread mutex replacement for URCU tls compat layer. + */ +static int ust_malloc_lock; + +static __attribute__((unused)) +void ust_malloc_spin_lock(pthread_mutex_t *lock) +{ + /* + * The memory barrier within cmpxchg takes care of ordering + * memory accesses with respect to the start of the critical + * section. + */ + while (uatomic_cmpxchg(&ust_malloc_lock, 0, 1) != 0) + caa_cpu_relax(); +} + +static __attribute__((unused)) +void ust_malloc_spin_unlock(pthread_mutex_t *lock) +{ + /* + * Ensure memory accesses within the critical section do not + * leak outside. + */ + cmm_smp_mb(); + 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 ust_malloc_spin_unlock +#undef ust_malloc_spin_lock #undef calloc /* @@ -227,7 +261,8 @@ void *malloc(size_t size) } retval = cur_alloc.malloc(size); if (URCU_TLS(malloc_nesting) == 1) { - tracepoint(ust_libc, malloc, size, retval); + tracepoint(ust_libc, malloc, size, retval, + __builtin_return_address(0)); } URCU_TLS(malloc_nesting)--; return retval; @@ -246,7 +281,8 @@ void free(void *ptr) } if (URCU_TLS(malloc_nesting) == 1) { - tracepoint(ust_libc, free, ptr); + tracepoint(ust_libc, free, ptr, + __builtin_return_address(0)); } if (cur_alloc.free == NULL) { @@ -275,7 +311,8 @@ void *calloc(size_t nmemb, size_t size) } retval = cur_alloc.calloc(nmemb, size); if (URCU_TLS(malloc_nesting) == 1) { - tracepoint(ust_libc, calloc, nmemb, size, retval); + tracepoint(ust_libc, calloc, nmemb, size, retval, + __builtin_return_address(0)); } URCU_TLS(malloc_nesting)--; return retval; @@ -327,7 +364,8 @@ void *realloc(void *ptr, size_t size) retval = cur_alloc.realloc(ptr, size); end: if (URCU_TLS(malloc_nesting) == 1) { - tracepoint(ust_libc, realloc, ptr, size, retval); + tracepoint(ust_libc, realloc, ptr, size, retval, + __builtin_return_address(0)); } URCU_TLS(malloc_nesting)--; return retval; @@ -347,7 +385,8 @@ void *memalign(size_t alignment, size_t size) } retval = cur_alloc.memalign(alignment, size); if (URCU_TLS(malloc_nesting) == 1) { - tracepoint(ust_libc, memalign, alignment, size, retval); + tracepoint(ust_libc, memalign, alignment, size, retval, + __builtin_return_address(0)); } URCU_TLS(malloc_nesting)--; return retval; @@ -368,7 +407,7 @@ 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) { tracepoint(ust_libc, posix_memalign, *memptr, alignment, size, - retval); + retval, __builtin_return_address(0)); } URCU_TLS(malloc_nesting)--; return retval;