[lttng-dev] [PATCH lttng-ust] Add trace support for calloc and realloc.
Mathieu Desnoyers
mathieu.desnoyers at efficios.com
Wed Aug 7 11:50:57 EDT 2013
* Stefan Seefeld (stefan_seefeld at mentor.com) wrote:
> ...and another revision of the previous patch, now with mutex-protected
> static_calloc.
> For consistency I have also adjusted the ust_libc.h header to use 'void
> *' instead of 'unsigned long' in its tracepoint declaration.
merged.
I also pushed the following on top:
commit 4c3536e01190b118e0889ebb991b0eea6f98260e
Author: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
Date: Wed Aug 7 11:48:50 2013 -0400
malloc instrumentation: remove dependency on pthread
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
I notice that memalign and posix_memalign are missing. Do you have plans
to add them ?
Thanks,
Mathieu
>
> Stefan
>
>
> --
> Stefan Seefeld
> CodeSourcery / Mentor Graphics
> http://www.mentor.com/embedded-software/
>
> From abbfdd44590876427a3fac463e8743afa7ceb149 Mon Sep 17 00:00:00 2001
> From: Stefan Seefeld <stefan_seefeld at mentor.com>
> Date: Sat, 27 Jul 2013 01:10:23 -0400
> Subject: [PATCH] Add trace support for calloc and realloc.
>
> Signed-off-by: Stefan Seefeld <stefan_seefeld at mentor.com>
> ---
> liblttng-ust-libc-wrapper/lttng-ust-malloc.c | 73 +++++++++++++++++++++++++++-
> liblttng-ust-libc-wrapper/ust_libc.h | 22 ++++++++-
> 2 files changed, 91 insertions(+), 4 deletions(-)
>
> diff --git a/liblttng-ust-libc-wrapper/lttng-ust-malloc.c b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c
> index 3212ff0..c7f747b 100644
> --- a/liblttng-ust-libc-wrapper/lttng-ust-malloc.c
> +++ b/liblttng-ust-libc-wrapper/lttng-ust-malloc.c
> @@ -21,14 +21,35 @@
> #include <dlfcn.h>
> #include <sys/types.h>
> #include <stdio.h>
> +#include <pthread.h>
>
> #define TRACEPOINT_DEFINE
> #define TRACEPOINT_CREATE_PROBES
> #include "ust_libc.h"
>
> +#define STATIC_CALLOC_LEN 4096
> +static char static_calloc_buf[STATIC_CALLOC_LEN];
> +static size_t static_calloc_buf_offset;
> +static pthread_mutex_t static_calloc_mutex = PTHREAD_MUTEX_INITIALIZER;
> +
> +static void *static_calloc(size_t nmemb, size_t size)
> +{
> + size_t prev_offset;
> +
> + pthread_mutex_lock(&static_calloc_mutex);
> + if (nmemb * size > sizeof(static_calloc_buf) - static_calloc_buf_offset) {
> + pthread_mutex_unlock(&static_calloc_mutex);
> + return NULL;
> + }
> + prev_offset = static_calloc_buf_offset;
> + static_calloc_buf_offset += nmemb * size;
> + pthread_mutex_unlock(&static_calloc_mutex);
> + return &static_calloc_buf[prev_offset];
> +}
> +
> void *malloc(size_t size)
> {
> - static void *(*plibc_malloc)(size_t size) = NULL;
> + static void *(*plibc_malloc)(size_t size);
> void *retval;
>
> if (plibc_malloc == NULL) {
> @@ -45,7 +66,16 @@ void *malloc(size_t size)
>
> void free(void *ptr)
> {
> - static void *(*plibc_free)(void *ptr) = NULL;
> + static void (*plibc_free)(void *ptr);
> +
> + /* Check whether the memory was allocated with
> + * static_calloc, in which case there is nothing
> + * to free.
> + */
> + if ((char *)ptr >= static_calloc_buf &&
> + (char *)ptr < static_calloc_buf + STATIC_CALLOC_LEN) {
> + return;
> + }
>
> if (plibc_free == NULL) {
> plibc_free = dlsym(RTLD_NEXT, "free");
> @@ -57,3 +87,42 @@ void free(void *ptr)
> tracepoint(ust_libc, free, ptr);
> plibc_free(ptr);
> }
> +
> +void *calloc(size_t nmemb, size_t size)
> +{
> + static void *(*volatile plibc_calloc)(size_t nmemb, size_t size);
> + void *retval;
> +
> + if (plibc_calloc == NULL) {
> + /*
> + * Temporarily redirect to static_calloc,
> + * until the dlsym lookup has completed.
> + */
> + plibc_calloc = static_calloc;
> + plibc_calloc = dlsym(RTLD_NEXT, "calloc");
> + if (plibc_calloc == NULL) {
> + fprintf(stderr, "callocwrap: unable to find calloc\n");
> + return NULL;
> + }
> + }
> + retval = plibc_calloc(nmemb, size);
> + tracepoint(ust_libc, calloc, nmemb, size, retval);
> + return retval;
> +}
> +
> +void *realloc(void *ptr, size_t size)
> +{
> + static void *(*plibc_realloc)(void *ptr, size_t size);
> + void *retval;
> +
> + if (plibc_realloc == NULL) {
> + plibc_realloc = dlsym(RTLD_NEXT, "realloc");
> + if (plibc_realloc == NULL) {
> + fprintf(stderr, "reallocwrap: unable to find realloc\n");
> + return NULL;
> + }
> + }
> + retval = plibc_realloc(ptr, size);
> + tracepoint(ust_libc, realloc, ptr, size, retval);
> + return retval;
> +}
> diff --git a/liblttng-ust-libc-wrapper/ust_libc.h b/liblttng-ust-libc-wrapper/ust_libc.h
> index af705aa..d2096a3 100644
> --- a/liblttng-ust-libc-wrapper/ust_libc.h
> +++ b/liblttng-ust-libc-wrapper/ust_libc.h
> @@ -36,14 +36,32 @@ TRACEPOINT_EVENT(ust_libc, malloc,
> TP_ARGS(size_t, size, void *, ptr),
> TP_FIELDS(
> ctf_integer(size_t, size, size)
> - ctf_integer_hex(unsigned long, ptr, (unsigned long) ptr)
> + ctf_integer_hex(void *, ptr, ptr)
> )
> )
>
> TRACEPOINT_EVENT(ust_libc, free,
> TP_ARGS(void *, ptr),
> TP_FIELDS(
> - ctf_integer_hex(unsigned long, ptr, (unsigned long) ptr)
> + ctf_integer_hex(void *, ptr, ptr)
> + )
> +)
> +
> +TRACEPOINT_EVENT(ust_libc, calloc,
> + TP_ARGS(size_t, nmemb, size_t, size, void *, ptr),
> + TP_FIELDS(
> + ctf_integer(size_t, nmemb, nmemb)
> + ctf_integer(size_t, size, size)
> + ctf_integer_hex(void *, ptr, ptr)
> + )
> +)
> +
> +TRACEPOINT_EVENT(ust_libc, realloc,
> + TP_ARGS(void *, in_ptr, size_t, size, void *, ptr),
> + TP_FIELDS(
> + ctf_integer_hex(void *, in_ptr, in_ptr)
> + ctf_integer(size_t, size, size)
> + ctf_integer_hex(void *, ptr, ptr)
> )
> )
>
> --
> 1.8.3.1
>
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
--
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
More information about the lttng-dev
mailing list