X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust-libc-wrapper%2Flttng-ust-malloc.c;h=e1ff8e807f7a9fb22dc6f783230ce6f1b1693e4f;hb=6ba6fd60507f8e045bdc4f1be14e9d99c6a15f7f;hp=652dd5ae977decbf24bf1587c2326902b74a0bd1;hpb=6d4658aa879ddabdd79fc6c637ee039413ad215b;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 652dd5ae..e1ff8e80 100644 --- a/liblttng-ust-libc-wrapper/lttng-ust-malloc.c +++ b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c @@ -1,36 +1,35 @@ /* - * Copyright (C) 2009 Pierre-Marc Fournier - * Copyright (C) 2011 Mathieu Desnoyers + * SPDX-License-Identifier: LGPL-2.1-or-later * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * Copyright (C) 2009 Pierre-Marc Fournier + * Copyright (C) 2011 Mathieu Desnoyers */ -#define _GNU_SOURCE -#include +/* + * 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 #include +#include + #include #include #include #include #include -#include + +#include + +#include +#include "ust-compat.h" #define TRACEPOINT_DEFINE #define TRACEPOINT_CREATE_PROBES +#define TP_IP_PARAM ip #include "ust_libc.h" #define STATIC_CALLOC_LEN 4096 @@ -62,8 +61,11 @@ void *static_calloc(size_t nmemb, size_t size); */ static int ust_malloc_lock; -static __attribute__((unused)) +static void ust_malloc_spin_lock(pthread_mutex_t *lock) + __attribute__((unused)); +static +void ust_malloc_spin_lock(pthread_mutex_t *lock __attribute__((unused))) { /* * The memory barrier within cmpxchg takes care of ordering @@ -74,8 +76,11 @@ void ust_malloc_spin_lock(pthread_mutex_t *lock) caa_cpu_relax(); } -static __attribute__((unused)) +static void ust_malloc_spin_unlock(pthread_mutex_t *lock) + __attribute__((unused)); +static +void ust_malloc_spin_unlock(pthread_mutex_t *lock __attribute__((unused))) { /* * Ensure memory accesses within the critical section do not @@ -89,8 +94,8 @@ void ust_malloc_spin_unlock(pthread_mutex_t *lock) #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 pthread_mutex_unlock +#undef pthread_mutex_lock #undef calloc /* @@ -115,7 +120,7 @@ void *static_calloc_aligned(size_t nmemb, size_t size, size_t alignment) res_offset = CMM_LOAD_SHARED(static_calloc_buf_offset); do { prev_offset = res_offset; - aligned_offset = ALIGN(prev_offset + sizeof(size_t), alignment); + aligned_offset = LTTNG_UST_ALIGN(prev_offset + sizeof(size_t), alignment); new_offset = aligned_offset + nmemb * size; if (new_offset > sizeof(static_calloc_buf)) { abort(); @@ -145,7 +150,7 @@ void *static_malloc(size_t size) } static -void static_free(void *ptr) +void static_free(void *ptr __attribute__((unused))) { /* no-op. */ } @@ -261,7 +266,7 @@ void *malloc(size_t size) retval = cur_alloc.malloc(size); if (URCU_TLS(malloc_nesting) == 1) { tracepoint(lttng_ust_libc, malloc, - size, retval, __builtin_return_address(0)); + size, retval, LTTNG_UST_CALLER_IP()); } URCU_TLS(malloc_nesting)--; return retval; @@ -281,7 +286,7 @@ void free(void *ptr) if (URCU_TLS(malloc_nesting) == 1) { tracepoint(lttng_ust_libc, free, - ptr, __builtin_return_address(0)); + ptr, LTTNG_UST_CALLER_IP()); } if (cur_alloc.free == NULL) { @@ -311,7 +316,7 @@ void *calloc(size_t nmemb, size_t size) retval = cur_alloc.calloc(nmemb, size); if (URCU_TLS(malloc_nesting) == 1) { tracepoint(lttng_ust_libc, calloc, - nmemb, size, retval, __builtin_return_address(0)); + nmemb, size, retval, LTTNG_UST_CALLER_IP()); } URCU_TLS(malloc_nesting)--; return retval; @@ -364,7 +369,7 @@ void *realloc(void *ptr, size_t size) end: if (URCU_TLS(malloc_nesting) == 1) { tracepoint(lttng_ust_libc, realloc, - ptr, size, retval, __builtin_return_address(0)); + ptr, size, retval, LTTNG_UST_CALLER_IP()); } URCU_TLS(malloc_nesting)--; return retval; @@ -386,7 +391,7 @@ void *memalign(size_t alignment, size_t size) if (URCU_TLS(malloc_nesting) == 1) { tracepoint(lttng_ust_libc, memalign, alignment, size, retval, - __builtin_return_address(0)); + LTTNG_UST_CALLER_IP()); } URCU_TLS(malloc_nesting)--; return retval; @@ -408,19 +413,25 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) if (URCU_TLS(malloc_nesting) == 1) { tracepoint(lttng_ust_libc, posix_memalign, *memptr, alignment, size, - retval, __builtin_return_address(0)); + retval, LTTNG_UST_CALLER_IP()); } URCU_TLS(malloc_nesting)--; return retval; } -__attribute__((constructor)) -void lttng_ust_malloc_wrapper_init(void) +static +void lttng_ust_fixup_malloc_nesting_tls(void) +{ + asm volatile ("" : : "m" (URCU_TLS(malloc_nesting))); +} + +void lttng_ust_libc_wrapper_malloc_init(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.