* Stefan Seefeld ([email protected]) 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 <[email protected]>
Date:   Wed Aug 7 11:48:50 2013 -0400

    malloc instrumentation: remove dependency on pthread
    
    Signed-off-by: Mathieu Desnoyers <[email protected]>

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 <[email protected]>
> Date: Sat, 27 Jul 2013 01:10:23 -0400
> Subject: [PATCH] Add trace support for calloc and realloc.
> 
> Signed-off-by: Stefan Seefeld <[email protected]>
> ---
>  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
> [email protected]
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com

_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to