mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
Update.
1999-11-01 Wolfram Gloger <wg@malloc.de> * malloc/malloc.h: Describe __malloc_initialize_hook. * manual/memory.texi: Document __malloc_initialize_hook. * sysdeps/unix/sysv/linux/setrlimit.c: Correctly use rlimits.
This commit is contained in:
@ -1,6 +1,11 @@
|
|||||||
|
1999-11-01 Wolfram Gloger <wg@malloc.de>
|
||||||
|
|
||||||
|
* malloc/malloc.h: Describe __malloc_initialize_hook.
|
||||||
|
* manual/memory.texi: Document __malloc_initialize_hook.
|
||||||
|
|
||||||
1999-11-11 Ulrich Drepper <drepper@cygnus.com>
|
1999-11-11 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
* sysdeps/unix/sysv/linux/setrlimit.c: COrrectly use rlimits.
|
* sysdeps/unix/sysv/linux/setrlimit.c: Correctly use rlimits.
|
||||||
|
|
||||||
1999-11-09 Andreas Jaeger <aj@suse.de>
|
1999-11-09 Andreas Jaeger <aj@suse.de>
|
||||||
|
|
||||||
|
@ -206,8 +206,11 @@ extern __malloc_ptr_t malloc_get_state __MALLOC_P ((void));
|
|||||||
extern int malloc_set_state __MALLOC_P ((__malloc_ptr_t __ptr));
|
extern int malloc_set_state __MALLOC_P ((__malloc_ptr_t __ptr));
|
||||||
|
|
||||||
#if defined __GLIBC__ || defined MALLOC_HOOKS
|
#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));
|
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,
|
extern void (*__free_hook) __MALLOC_PMT ((__malloc_ptr_t __ptr,
|
||||||
__const __malloc_ptr_t));
|
__const __malloc_ptr_t));
|
||||||
extern __malloc_ptr_t (*__malloc_hook) __MALLOC_PMT ((size_t __size,
|
extern __malloc_ptr_t (*__malloc_hook) __MALLOC_PMT ((size_t __size,
|
||||||
|
@ -731,6 +731,34 @@ should make sure to restore all the hooks to their previous value. When
|
|||||||
coming back from the recursive call, all the hooks should be resaved
|
coming back from the recursive call, all the hooks should be resaved
|
||||||
since a hook might modify itself.
|
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
|
Here is an example showing how to use @code{__malloc_hook} and
|
||||||
@code{__free_hook} properly. It installs a function that prints out
|
@code{__free_hook} properly. It installs a function that prints out
|
||||||
information every time @code{malloc} or @code{free} is called. We just
|
information every time @code{malloc} or @code{free} is called. We just
|
||||||
@ -743,8 +771,21 @@ static void *(*old_malloc_hook) (size_t);
|
|||||||
static void (*old_free_hook) (void*);
|
static void (*old_free_hook) (void*);
|
||||||
|
|
||||||
/* Prototypes for our hooks. */
|
/* Prototypes for our hooks. */
|
||||||
|
static void *my_init_hook (void);
|
||||||
static void *my_malloc_hook (size_t);
|
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 *
|
static void *
|
||||||
my_malloc_hook (size_t size)
|
my_malloc_hook (size_t size)
|
||||||
@ -787,11 +828,6 @@ my_free_hook (void *ptr)
|
|||||||
main ()
|
main ()
|
||||||
@{
|
@{
|
||||||
...
|
...
|
||||||
old_malloc_hook = __malloc_hook;
|
|
||||||
old_free_hook = __free_hook;
|
|
||||||
__malloc_hook = my_malloc_hook;
|
|
||||||
__free_hook = my_free_hook;
|
|
||||||
...
|
|
||||||
@}
|
@}
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user