Problem with __malloc_hooks :-(
Wolfram Gloger
wmglo@dent.med.uni-muenchen.de
Mon Nov 1 14:53:00 GMT 1999
> Wolfram> Give me a few days please, I will send a patch for the malloc hooks
> Wolfram> docs and malloc.h.
OK, here is the promised patch.
Regards,
Wolfram.
1999-11-01 Wolfram Gloger <wg@malloc.de>
* malloc/malloc.h: Describe __malloc_initialize_hook.
* manual/memory.texi: Document __malloc_initialize_hook.
--- malloc/malloc.h~ Sun Jun 13 18:20:48 1999
+++ malloc/malloc.h Mon Nov 1 23:37:57 1999
@@ -204,8 +204,11 @@
extern int malloc_set_state __MALLOC_P ((__malloc_ptr_t __ptr));
#if defined __GLIBC__ || defined MALLOC_HOOKS
-/* Hooks for debugging versions. */
+/* Called once when malloc is initialized; redefining this variable in
+ the application provides the preferred way to set up the hook
+ pointers. */
extern void (*__malloc_initialize_hook) __MALLOC_PMT ((void));
+/* Hooks for debugging and user-defined versions. */
extern void (*__free_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr,
__const __malloc_ptr_t));
extern __malloc_ptr_t (*__malloc_hook) __MALLOC_PMT ((size_t __size,
--- manual/memory.texi~ Mon Jan 11 20:59:48 1999
+++ manual/memory.texi Mon Nov 1 23:31:14 1999
@@ -731,6 +731,34 @@
coming back from the recursive call, all the hooks should be resaved
since a hook might modify itself.
+@comment malloc.h
+@comment GNU
+@defvar __malloc_initialize_hook
+The value of this variable is a pointer to a function that is called
+once when the malloc implementation is initialized. This is a weak
+variable, so it can be overridden in the application with a definition
+like the following:
+
+@smallexample
+void (*@var{__malloc_initialize_hook}) (void) = my_init_hook;
+@end smallexample
+@end defvar
+
+An issue to look out for is the time at which the malloc hook functions
+can be safely installed. If the hook functions call the malloc-related
+functions recursively, it is necessary that malloc has already properly
+initialized itself at the time when @code{__malloc_hook} etc. is
+assigned to. On the other hand, if the hook functions provide a
+complete malloc implementation of their own, it is vital that the hooks
+are assigned to @emph{before} the very first @code{malloc} call has
+completed, because otherwise a chunk obtained from the ordinary,
+un-hooked malloc may later be handed to @code{__free_hook}, for example.
+
+In both cases, the problem can be solved by setting up the hooks from
+within a user-defined function pointed to by
+@code{__malloc_initialize_hook}---then the hooks will be set up safely
+at the right time.
+
Here is an example showing how to use @code{__malloc_hook} and
@code{__free_hook} properly. It installs a function that prints out
information every time @code{malloc} or @code{free} is called. We just
@@ -743,8 +771,21 @@
static void (*old_free_hook) (void*);
/* Prototypes for our hooks. */
+static void *my_init_hook (void);
static void *my_malloc_hook (size_t);
-static void my_free_hook(void*);
+static void my_free_hook (void*);
+
+/* Override initializing hook from the C library. */
+void (*__malloc_initialize_hook) (void) = my_init_hook;
+
+static void
+my_init_hook (void)
+@{
+ old_malloc_hook = __malloc_hook;
+ old_free_hook = __free_hook;
+ __malloc_hook = my_malloc_hook;
+ __free_hook = my_free_hook;
+@}
static void *
my_malloc_hook (size_t size)
@@ -786,11 +827,6 @@
main ()
@{
- ...
- old_malloc_hook = __malloc_hook;
- old_free_hook = __free_hook;
- __malloc_hook = my_malloc_hook;
- __free_hook = my_free_hook;
...
@}
@end smallexample
More information about the Libc-alpha
mailing list