This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH v2] malloc: Set and reset all hooks for tracing (Bug 16573)
- From: DJ Delorie <dj at redhat dot com>
- To: "Carlos O'Donell" <codonell at redhat dot com>
- Cc: libc-alpha at sourceware dot org, kcy at codesourcery dot com, joseph at codesourcery dot com, ams at codesourcery dot com, fweimer at redhat dot com
- Date: Mon, 08 Apr 2019 21:27:43 -0400
- Subject: Re: [PATCH v2] malloc: Set and reset all hooks for tracing (Bug 16573)
Reviewed-by: DJ Delorie <dj@redhat.com>
"Carlos O'Donell" <codonell@redhat.com> writes:
> +static void tr_freehook (void *, const void *);
> +static void * tr_mallochook (size_t, const void *);
> +static void * tr_reallochook (void *, size_t, const void *);
> +static void * tr_memalignhook (size_t, size_t, const void *);
Ok, these all match the prototypes now ;-)
> +/* Set all the default non-trace hooks. */
> +static __always_inline void
> +set_default_hooks (void)
static __always_inline void is used elsewhere in glibc, so OK.
> +{
> + __free_hook = tr_old_free_hook;
> + __malloc_hook = tr_old_malloc_hook;
> + __realloc_hook = tr_old_realloc_hook;
> + __memalign_hook = tr_old_memalign_hook;
> +}
This basically undoes save_default_hooks. Ok. It sets all hooks to
their original defaults.
> +/* Set all of the tracing hooks used for mtrace. */
> +static __always_inline void
> +set_trace_hooks (void)
> +{
> + __free_hook = tr_freehook;
> + __malloc_hook = tr_mallochook;
> + __realloc_hook = tr_reallochook;
> + __memalign_hook = tr_memalignhook;
> +}
This sets up the hooks for tracing. Ok.
> +/* Save the current set of hooks as the default hooks. */
> +static __always_inline void
> +save_default_hooks (void)
> +{
> + tr_old_free_hook = __free_hook;
> + tr_old_malloc_hook = __malloc_hook;
> + tr_old_realloc_hook = __realloc_hook;
> + tr_old_memalign_hook = __memalign_hook;
> +}
Ok.
> - __free_hook = tr_old_free_hook;
> + set_default_hooks ();
set_default restores the original defaults. OK.
> if (tr_old_free_hook != NULL)
> (*tr_old_free_hook)(ptr, caller);
> else
> free (ptr);
> - __free_hook = tr_freehook;
> + set_trace_hooks ();
Then we go back to trace hooks. Ok.
> - __malloc_hook = tr_old_malloc_hook;
> + set_default_hooks ();
Ok. Always default/trace call pairs.
> - __malloc_hook = tr_mallochook;
> + set_trace_hooks ();
Ok.
> - __free_hook = tr_old_free_hook;
> - __malloc_hook = tr_old_malloc_hook;
> - __realloc_hook = tr_old_realloc_hook;
> + set_default_hooks ();
Ok.
> - __free_hook = tr_freehook;
> - __malloc_hook = tr_mallochook;
> - __realloc_hook = tr_reallochook;
> + set_trace_hooks ();
Ok.
> - __memalign_hook = tr_old_memalign_hook;
> - __malloc_hook = tr_old_malloc_hook;
> + set_default_hooks ();
Ok.
> - __memalign_hook = tr_memalignhook;
> - __malloc_hook = tr_mallochook;
> + set_trace_hooks ();
Ok. Last of the default/trace pairs.
> - tr_old_free_hook = __free_hook;
> - __free_hook = tr_freehook;
> - tr_old_malloc_hook = __malloc_hook;
> - __malloc_hook = tr_mallochook;
> - tr_old_realloc_hook = __realloc_hook;
> - __realloc_hook = tr_reallochook;
> - tr_old_memalign_hook = __memalign_hook;
> - __memalign_hook = tr_memalignhook;
> + save_default_hooks ();
> + set_trace_hooks ();
We first save all the original hooks, then put in our own. Ok.
> - __free_hook = tr_old_free_hook;
> - __malloc_hook = tr_old_malloc_hook;
> - __realloc_hook = tr_old_realloc_hook;
> - __memalign_hook = tr_old_memalign_hook;
> + set_default_hooks ();
And lastly restore the defaults.