summaryrefslogtreecommitdiff
path: root/malloc
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-12-17 23:52:56 +0000
committerUlrich Drepper <drepper@redhat.com>2003-12-17 23:52:56 +0000
commite796f92f68585f61412f569e4b4f49b5e21d80df (patch)
treeb3cb5d9bf8e91e54d6d443330b2bad65ac867580 /malloc
parent0278652840d0b09297986baee97ab46c136f304c (diff)
Update.
2003-12-17 Jakub Jelinek <jakub@redhat.com> * malloc/mtrace.c (tr_old_memalign_hook): New variable. (tr_memalignhook): New function. (mtrace): Register tr_memalignhook. (muntrace): Deregister tr_memalignhook. * malloc/malloc.c (__posix_memalign): If __memalign_hook != NULL, call it directly instead of memalign_internal. 2003-12-17 Ulrich Drepper <drepper@redhat.com> * misc/mntent_r.c: Change encoding to match recently change decoder. Patch by Alexander Achenbach <xela@slit.de>. 2003-12-16 Steven Munroe <sjmunroe@us.ibm.com> * sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h: Correct definition of vrregset_t. 2003-12-16 Steven Munroe <sjmunroe@us.ibm.com> * sysdeps/unix/sysv/linux/powerpc/sys/procfs.h [!__PPC64_ELF_H]: Extent conditional to include typedef elf_vrreg_t. 2002-12-17 Paolo Bonzini <bonzini@gnu.org> * posix/regexec.c (re_search_internal): Limit search to the beginning of the buffer if the initial states are empty for contexts that do not include CONTEXT_BEGBUF or, if !preg->newline_anchor, that do not include any one of CONTEXT_BEGBUF and CONTEXT_NEWLINE.
Diffstat (limited to 'malloc')
-rw-r--r--malloc/malloc.c10
-rw-r--r--malloc/mtrace.c39
2 files changed, 48 insertions, 1 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c
index c26d6676aa..4e959d20a2 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -5389,13 +5389,21 @@ int
__posix_memalign (void **memptr, size_t alignment, size_t size)
{
void *mem;
+ __malloc_ptr_t (*hook) __MALLOC_PMT ((size_t, size_t,
+ __const __malloc_ptr_t)) =
+ __memalign_hook;
/* Test whether the SIZE argument is valid. It must be a power of
two multiple of sizeof (void *). */
if (alignment % sizeof (void *) != 0 || !powerof2 (alignment) != 0)
return EINVAL;
- mem = __memalign_internal (alignment, size);
+ /* Call the hook here, so that caller is posix_memalign's caller
+ and not posix_memalign itself. */
+ if (hook != NULL)
+ mem = (*hook)(alignment, size, RETURN_ADDRESS (0));
+ else
+ mem = __memalign_internal (alignment, size);
if (mem != NULL) {
*memptr = mem;
diff --git a/malloc/mtrace.c b/malloc/mtrace.c
index 6cdd5f3324..c4239ddfba 100644
--- a/malloc/mtrace.c
+++ b/malloc/mtrace.c
@@ -71,6 +71,9 @@ static __ptr_t (*tr_old_malloc_hook) __P ((__malloc_size_t size,
static __ptr_t (*tr_old_realloc_hook) __P ((__ptr_t ptr,
__malloc_size_t size,
const __ptr_t));
+static __ptr_t (*tr_old_memalign_hook) __P ((__malloc_size_t __alignment,
+ __malloc_size_t __size,
+ __const __ptr_t));
/* This function is called when the block being alloc'd, realloc'd, or
freed has an address matching the variable "mallwatch". In a debugger,
@@ -233,6 +236,39 @@ tr_reallochook (ptr, size, caller)
return hdr;
}
+static __ptr_t tr_memalignhook __P ((__malloc_size_t, __malloc_size_t,
+ const __ptr_t));
+static __ptr_t
+tr_memalignhook (alignment, size, caller)
+ __malloc_size_t alignment, size;
+ const __ptr_t caller;
+{
+ __ptr_t hdr;
+
+ __libc_lock_lock (lock);
+
+ __memalign_hook = tr_old_memalign_hook;
+ __malloc_hook = tr_old_malloc_hook;
+ if (tr_old_memalign_hook != NULL)
+ hdr = (__ptr_t) (*tr_old_memalign_hook) (alignment, size, caller);
+ else
+ hdr = (__ptr_t) memalign (alignment, size);
+ __memalign_hook = tr_memalignhook;
+ __malloc_hook = tr_mallochook;
+
+ tr_where (caller);
+ /* We could be printing a NULL here; that's OK. */
+ fprintf (mallstream, "+ %p %#lx\n", hdr, (unsigned long int) size);
+
+ __libc_lock_unlock (lock);
+
+ if (hdr == mallwatch)
+ tr_break ();
+
+ return hdr;
+}
+
+
#ifdef _LIBC
@@ -300,6 +336,8 @@ mtrace ()
__malloc_hook = tr_mallochook;
tr_old_realloc_hook = __realloc_hook;
__realloc_hook = tr_reallochook;
+ tr_old_memalign_hook = __memalign_hook;
+ __memalign_hook = tr_memalignhook;
#ifdef _LIBC
if (!added_atexit_handler)
{
@@ -327,4 +365,5 @@ muntrace ()
__free_hook = tr_old_free_hook;
__malloc_hook = tr_old_malloc_hook;
__realloc_hook = tr_old_realloc_hook;
+ __memalign_hook = tr_old_memalign_hook;
}