* update ptmalloc2 to build properly and intercept user-level calls to
munmap This commit was SVN r6867.
Этот коммит содержится в:
родитель
683e80c48b
Коммит
da89e06238
@ -38,6 +38,8 @@ doc_DATA = ptmalloc2-COPYRIGHT
|
|||||||
noinst_LTLIBRARIES = libmca_memory_ptmalloc2.la
|
noinst_LTLIBRARIES = libmca_memory_ptmalloc2.la
|
||||||
|
|
||||||
libmca_memory_ptmalloc2_la_SOURCES = \
|
libmca_memory_ptmalloc2_la_SOURCES = \
|
||||||
|
ptmalloc2_component.c \
|
||||||
|
ptmalloc2_munmap.c \
|
||||||
malloc.c \
|
malloc.c \
|
||||||
malloc-stats.c \
|
malloc-stats.c \
|
||||||
malloc.h
|
malloc.h
|
||||||
|
@ -564,9 +564,9 @@ public_sET_STATe(Void_t* msptr)
|
|||||||
/* There are no fastchunks. */
|
/* There are no fastchunks. */
|
||||||
clear_fastchunks(&main_arena);
|
clear_fastchunks(&main_arena);
|
||||||
set_max_fast(&main_arena, DEFAULT_MXFAST);
|
set_max_fast(&main_arena, DEFAULT_MXFAST);
|
||||||
for (i=0; i<NFASTBINS; ++i)
|
for (i=0; i<(int)NFASTBINS; ++i)
|
||||||
main_arena.fastbins[i] = 0;
|
main_arena.fastbins[i] = 0;
|
||||||
for (i=0; i<BINMAPSIZE; ++i)
|
for (i=0; i<(int)BINMAPSIZE; ++i)
|
||||||
main_arena.binmap[i] = 0;
|
main_arena.binmap[i] = 0;
|
||||||
top(&main_arena) = ms->av[2];
|
top(&main_arena) = ms->av[2];
|
||||||
main_arena.last_remainder = 0;
|
main_arena.last_remainder = 0;
|
||||||
@ -576,8 +576,8 @@ public_sET_STATe(Void_t* msptr)
|
|||||||
assert(ms->av[2*i+3] == 0);
|
assert(ms->av[2*i+3] == 0);
|
||||||
first(b) = last(b) = b;
|
first(b) = last(b) = b;
|
||||||
} else {
|
} else {
|
||||||
if(i<NSMALLBINS || (largebin_index(chunksize(ms->av[2*i+2]))==i &&
|
if(i<(int)NSMALLBINS || ((int)largebin_index(chunksize(ms->av[2*i+2]))==i &&
|
||||||
largebin_index(chunksize(ms->av[2*i+3]))==i)) {
|
(int)largebin_index(chunksize(ms->av[2*i+3]))==i)) {
|
||||||
first(b) = ms->av[2*i+2];
|
first(b) = ms->av[2*i+2];
|
||||||
last(b) = ms->av[2*i+3];
|
last(b) = ms->av[2*i+3];
|
||||||
/* Make sure the links to the bins within the heap are correct. */
|
/* Make sure the links to the bins within the heap are correct. */
|
||||||
|
@ -91,7 +91,7 @@ void public_mSTATs()
|
|||||||
struct malloc_global_info mgi;
|
struct malloc_global_info mgi;
|
||||||
struct malloc_arena_info mai;
|
struct malloc_arena_info mai;
|
||||||
unsigned long in_use_b, system_b, avail_b;
|
unsigned long in_use_b, system_b, avail_b;
|
||||||
#if THREAD_STATS
|
#if defined(THREAD_STATS) && THREAD_STATS
|
||||||
long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
|
long stat_lock_direct = 0, stat_lock_loop = 0, stat_lock_wait = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -120,7 +120,7 @@ void public_mSTATs()
|
|||||||
#endif
|
#endif
|
||||||
system_b += mai.system_mem;
|
system_b += mai.system_mem;
|
||||||
in_use_b += mai.system_mem - avail_b;
|
in_use_b += mai.system_mem - avail_b;
|
||||||
#if THREAD_STATS
|
#if defined(THREAD_STATS) && THREAD_STATS
|
||||||
stat_lock_direct += mai.stat_lock_direct;
|
stat_lock_direct += mai.stat_lock_direct;
|
||||||
stat_lock_loop += mai.stat_lock_loop;
|
stat_lock_loop += mai.stat_lock_loop;
|
||||||
stat_lock_wait += mai.stat_lock_wait;
|
stat_lock_wait += mai.stat_lock_wait;
|
||||||
@ -142,7 +142,7 @@ void public_mSTATs()
|
|||||||
fprintf(stderr, "max mmap bytes = %10lu\n",
|
fprintf(stderr, "max mmap bytes = %10lu\n",
|
||||||
(unsigned long)mgi.max_mmapped_mem);
|
(unsigned long)mgi.max_mmapped_mem);
|
||||||
#endif
|
#endif
|
||||||
#if THREAD_STATS
|
#if defined(THREAD_STATS) && THREAD_STATS
|
||||||
fprintf(stderr, "heaps created = %10d\n", mgi.stat_n_heaps);
|
fprintf(stderr, "heaps created = %10d\n", mgi.stat_n_heaps);
|
||||||
fprintf(stderr, "locked directly = %10ld\n", stat_lock_direct);
|
fprintf(stderr, "locked directly = %10ld\n", stat_lock_direct);
|
||||||
fprintf(stderr, "locked in loop = %10ld\n", stat_lock_loop);
|
fprintf(stderr, "locked in loop = %10ld\n", stat_lock_loop);
|
||||||
|
@ -2,40 +2,11 @@
|
|||||||
#define OMPI_DISABLE_ENABLE_MEM_DEBUG 1
|
#define OMPI_DISABLE_ENABLE_MEM_DEBUG 1
|
||||||
#include "ompi_config.h"
|
#include "ompi_config.h"
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <sys/types.h>
|
|
||||||
|
|
||||||
#include "opal/mca/memory/memory.h"
|
|
||||||
#include "opal/memory/memory_internal.h"
|
#include "opal/memory/memory_internal.h"
|
||||||
|
|
||||||
const opal_memory_base_component_1_0_0_t mca_memory_ptmalloc2_component = {
|
|
||||||
/* First, the mca_component_t struct containing meta information
|
|
||||||
about the component itself */
|
|
||||||
{
|
|
||||||
/* Indicate that we are a memory v1.0.0 component (which also
|
|
||||||
implies a specific MCA version) */
|
|
||||||
OPAL_MEMORY_BASE_VERSION_1_0_0,
|
|
||||||
|
|
||||||
/* Component name and version */
|
|
||||||
"ptmalloc2s",
|
|
||||||
OPAL_MAJOR_VERSION,
|
|
||||||
OPAL_MINOR_VERSION,
|
|
||||||
OPAL_RELEASE_VERSION,
|
|
||||||
|
|
||||||
/* Component open and close functions */
|
|
||||||
NULL,
|
|
||||||
NULL
|
|
||||||
},
|
|
||||||
|
|
||||||
/* Next the MCA v1.0.0 component meta data */
|
|
||||||
{
|
|
||||||
/* Whether the component is checkpointable or not */
|
|
||||||
true
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Not all systems have sbrk() declared, since it's technically not a
|
* Not all systems have sbrk() declared, since it's technically not a
|
||||||
* POSIX function.
|
* POSIX function.
|
||||||
@ -55,12 +26,7 @@ opal_mem_free_ptmalloc2_sbrk(int inc)
|
|||||||
return sbrk(inc);
|
return sbrk(inc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
extern int opal_mem_free_ptmalloc2_munmap(void *start, size_t length);
|
||||||
opal_mem_free_ptmalloc2_munmap(void *start, size_t length)
|
|
||||||
{
|
|
||||||
opal_mem_free_release_hook(start, length);
|
|
||||||
return munmap(start, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define MORECORE opal_mem_free_ptmalloc2_sbrk
|
#define MORECORE opal_mem_free_ptmalloc2_sbrk
|
||||||
#define munmap(a,b) opal_mem_free_ptmalloc2_munmap(a,b)
|
#define munmap(a,b) opal_mem_free_ptmalloc2_munmap(a,b)
|
||||||
@ -78,24 +44,6 @@ opal_mem_free_ptmalloc2_munmap(void *start, size_t length)
|
|||||||
#define __const const
|
#define __const const
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* need to intercept munmap from the user as well as the usual
|
|
||||||
malloc. 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 = dlsym(RTLD_NEXT, "munmap");
|
|
||||||
}
|
|
||||||
|
|
||||||
return realmunmap(addr, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/********************* BEGIN OMPI CHANGES ******************************/
|
/********************* BEGIN OMPI CHANGES ******************************/
|
||||||
|
|
||||||
|
|
||||||
@ -955,7 +903,7 @@ Void_t* public_mALLOc();
|
|||||||
#ifdef libc_hidden_proto
|
#ifdef libc_hidden_proto
|
||||||
libc_hidden_proto (public_mALLOc)
|
libc_hidden_proto (public_mALLOc)
|
||||||
#endif
|
#endif
|
||||||
static void here(void);
|
|
||||||
/*
|
/*
|
||||||
free(Void_t* p)
|
free(Void_t* p)
|
||||||
Releases the chunk of memory pointed to by p, that had been previously
|
Releases the chunk of memory pointed to by p, that had been previously
|
||||||
@ -3729,7 +3677,7 @@ public_cALLOc(size_t n, size_t elem_size)
|
|||||||
#if MORECORE_CLEARS < 2
|
#if MORECORE_CLEARS < 2
|
||||||
/* Only newly allocated memory is guaranteed to be cleared. */
|
/* Only newly allocated memory is guaranteed to be cleared. */
|
||||||
if (av == &main_arena &&
|
if (av == &main_arena &&
|
||||||
oldtopsize < mp_.sbrk_base + av->max_system_mem - (char *)oldtop)
|
oldtopsize < (INTERNAL_SIZE_T)(mp_.sbrk_base + av->max_system_mem - (char *)oldtop))
|
||||||
oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop);
|
oldtopsize = (mp_.sbrk_base + av->max_system_mem - (char *)oldtop);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
45
opal/mca/memory/ptmalloc2/ptmalloc2_component.c
Обычный файл
45
opal/mca/memory/ptmalloc2/ptmalloc2_component.c
Обычный файл
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* 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 "ompi_config.h"
|
||||||
|
|
||||||
|
#include "opal/mca/memory/memory.h"
|
||||||
|
|
||||||
|
const opal_memory_base_component_1_0_0_t mca_memory_ptmalloc2_component = {
|
||||||
|
/* First, the mca_component_t struct containing meta information
|
||||||
|
about the component itself */
|
||||||
|
{
|
||||||
|
/* Indicate that we are a memory v1.0.0 component (which also
|
||||||
|
implies a specific MCA version) */
|
||||||
|
OPAL_MEMORY_BASE_VERSION_1_0_0,
|
||||||
|
|
||||||
|
/* Component name and version */
|
||||||
|
"ptmalloc2",
|
||||||
|
OPAL_MAJOR_VERSION,
|
||||||
|
OPAL_MINOR_VERSION,
|
||||||
|
OPAL_RELEASE_VERSION,
|
||||||
|
|
||||||
|
/* Component open and close functions */
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Next the MCA v1.0.0 component meta data */
|
||||||
|
{
|
||||||
|
/* Whether the component is checkpointable or not */
|
||||||
|
true
|
||||||
|
},
|
||||||
|
};
|
55
opal/mca/memory/ptmalloc2/ptmalloc2_munmap.c
Обычный файл
55
opal/mca/memory/ptmalloc2/ptmalloc2_munmap.c
Обычный файл
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* 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 <sys/types.h>
|
||||||
|
|
||||||
|
#include "opal/memory/memory_internal.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#define __USE_GNU
|
||||||
|
#include <dlfcn.h>
|
||||||
|
|
||||||
|
static int (*realmunmap)(void*, size_t);
|
||||||
|
|
||||||
|
/* 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)
|
||||||
|
{
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* put this here beacuse malloc.c really doesn't like dlfcn.h, but we
|
||||||
|
need it for getting the right munmap... */
|
||||||
|
int
|
||||||
|
opal_mem_free_ptmalloc2_munmap(void *start, size_t length)
|
||||||
|
{
|
||||||
|
opal_mem_free_release_hook(start, length);
|
||||||
|
|
||||||
|
if (NULL == realmunmap) {
|
||||||
|
realmunmap = (int (*)(void*, size_t)) dlsym(RTLD_NEXT, "munmap");
|
||||||
|
}
|
||||||
|
|
||||||
|
return realmunmap(start, length);
|
||||||
|
}
|
Загрузка…
x
Ссылка в новой задаче
Block a user