1
1
Brian Barrett 22d28075eb * put component struct in it's own file. It requires the inclusion of
ompi_config.h, which can't be included in all the intercept code

This commit was SVN r6865.
2005-08-14 02:18:11 +00:00

110 строки
2.9 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University.
* All rights reserved.
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
* All rights reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <malloc.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdio.h>
#define __USE_GNU
#include <dlfcn.h>
#include "opal/memory/memory_internal.h"
/* Prototypes for our hooks. */
static void opal_mem_free_init_hook (void);
static void opal_mem_free_free_hook (void*, const void *);
static void* opal_mem_free_realloc_hook (void*, size_t, const void *);
/* Override initializing hook from the C library. */
void (*__malloc_initialize_hook) (void) = opal_mem_free_init_hook;
/* local variable - next in stack of free hooks */
static void (*old_free_hook)(void*, const void*);
static void* (*old_realloc_hook)(void*, size_t, const void*);
static void
opal_mem_free_init_hook (void)
{
opal_mem_free_set_free_support(1);
old_free_hook = __free_hook;
old_realloc_hook = __realloc_hook;
__free_hook = opal_mem_free_free_hook;
__realloc_hook = opal_mem_free_realloc_hook;
}
static void
opal_mem_free_free_hook (void *ptr, const void *caller)
{
/* dispatch about the pending free */
opal_mem_free_release_hook(ptr, malloc_usable_size(ptr));
__free_hook = old_free_hook;
/* call the next chain down */
free(ptr);
/* save the hooks again and restore our hook again */
old_free_hook = __free_hook;
__free_hook = opal_mem_free_free_hook;
}
/* for better or worse, we must assume that the buffer being passed to
realloc is not going to be expandable and therefore is going to be
free()ed. */
static void*
opal_mem_free_realloc_hook (void *ptr, size_t size, const void *caller)
{
void *ret;
/* dispatch about the pending free */
opal_mem_free_release_hook(ptr, malloc_usable_size(ptr));
__realloc_hook = old_realloc_hook;
/* call the next chain down */
ret = realloc(ptr, size);
/* save the hooks again and restore our hook again */
old_realloc_hook = __realloc_hook;
__realloc_hook = opal_mem_free_realloc_hook;
return ret;
}
/* munmap is a weak symbol on any platform that I know of that
supports malloc hooks, so we can just intercept it like this... */
int
munmap(void* addr, size_t len)
{
static int (*realmunmap)(void*, size_t);
/* dispatch about the pending release */
opal_mem_free_release_hook(addr, len);
if (NULL == realmunmap) {
realmunmap = (int (*)(void*, size_t)) dlsym(RTLD_NEXT, "munmap");
}
return realmunmap(addr, len);
}