/*
- * Copyright (C) 2009 Pierre-Marc Fournier
- * Copyright (C) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * 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 <mathieu.desnoyers@efficios.com>
*/
-#define _GNU_SOURCE
-#include <lttng/ust-dlfcn.h>
+/*
+ * Do _not_ define _LGPL_SOURCE because we don't want to create a
+ * circular dependency loop between this malloc wrapper, liburcu and
+ * libc.
+ */
+#include <ust-dlfcn.h>
#include <sys/types.h>
#include <stdio.h>
#include <assert.h>
#include <urcu/compiler.h>
#include <urcu/tls-compat.h>
#include <urcu/arch.h>
-#include <lttng/align.h>
+#include <ust-helper.h>
+#include "ust-compat.h"
#define TRACEPOINT_DEFINE
#define TRACEPOINT_CREATE_PROBES
-#define TP_IP_PARAM caller
+#define TP_IP_PARAM ip
#include "ust_libc.h"
#define STATIC_CALLOC_LEN 4096
*/
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)
{
/*
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)
{
/*
#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
/*
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();
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;
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) {
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;
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;
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;
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;
}
+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)
+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.