Skip to content

Commit

Permalink
[MALLOC_DEBUG]: Keep track of current maximum number of mmaps. n_mmap…
Browse files Browse the repository at this point in the history
…s_max is the target.
  • Loading branch information
Ulrich Drepper committed May 13, 2007
1 parent 11ed671 commit bf98bd2
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 4 deletions.
3 changes: 3 additions & 0 deletions malloc/arena.c
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,9 @@ ptmalloc_init_minimal (void)
mp_.top_pad = DEFAULT_TOP_PAD;
#endif
mp_.n_mmaps_max = DEFAULT_MMAP_MAX;
#if MALLOC_DEBUG
mp_.n_mmaps_cmax = DEFAULT_MMAP_MAX;
#endif
mp_.mmap_threshold = DEFAULT_MMAP_THRESHOLD;
mp_.trim_threshold = DEFAULT_TRIM_THRESHOLD;
mp_.pagesize = malloc_getpagesize;
Expand Down
11 changes: 10 additions & 1 deletion malloc/hooks.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* Malloc implementation for multiple threads without lock contention.
Copyright (C) 2001,2002,2003,2004,2005,2006 Free Software Foundation, Inc.
Copyright (C) 2001-2006, 2007 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Wolfram Gloger <wg@malloc.de>, 2001.
Expand Down Expand Up @@ -507,6 +507,9 @@ struct malloc_save_state {
unsigned long trim_threshold;
unsigned long top_pad;
unsigned int n_mmaps_max;
#if MALLOC_DEBUG
unsigned int n_mmaps_cmax;
#endif
unsigned long mmap_threshold;
int check_action;
unsigned long max_sbrked_mem;
Expand Down Expand Up @@ -550,6 +553,9 @@ public_gET_STATe(void)
ms->trim_threshold = mp_.trim_threshold;
ms->top_pad = mp_.top_pad;
ms->n_mmaps_max = mp_.n_mmaps_max;
#if MALLOC_DEBUG
ms->n_mmaps_cmax = mp_.n_mmaps_cmax;
#endif
ms->mmap_threshold = mp_.mmap_threshold;
ms->check_action = check_action;
ms->max_sbrked_mem = main_arena.max_system_mem;
Expand Down Expand Up @@ -621,6 +627,9 @@ public_sET_STATe(Void_t* msptr)
mp_.trim_threshold = ms->trim_threshold;
mp_.top_pad = ms->top_pad;
mp_.n_mmaps_max = ms->n_mmaps_max;
#if MALLOC_DEBUG
mp_.n_mmaps_cmax = ms->n_mmaps_cmax;
#endif
mp_.mmap_threshold = ms->mmap_threshold;
check_action = ms->check_action;
main_arena.max_system_mem = ms->max_sbrked_mem;
Expand Down
29 changes: 26 additions & 3 deletions malloc/malloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2343,6 +2343,9 @@ struct malloc_par {
/* Memory map support */
int n_mmaps;
int n_mmaps_max;
#if MALLOC_DEBUG
int n_mmaps_cmax;
#endif
int max_n_mmaps;
/* the mmap_threshold is dynamic, until the user sets
it manually, at which point we need to disable any
Expand Down Expand Up @@ -2858,7 +2861,8 @@ static void do_check_malloc_state(mstate av)
assert(total <= (unsigned long)(mp_.max_total_mem));
assert(mp_.n_mmaps >= 0);
#endif
assert(mp_.n_mmaps <= mp_.n_mmaps_max);
assert(mp_.n_mmaps <= mp_.n_mmaps_cmax);
assert(mp_.n_mmaps_max <= mp_.n_mmaps_cmax);
assert(mp_.n_mmaps <= mp_.max_n_mmaps);

assert((unsigned long)(av->system_mem) <=
Expand Down Expand Up @@ -3456,6 +3460,13 @@ munmap_chunk(p) mchunkptr p;
}

mp_.n_mmaps--;
#if MALLOC_DEBUG
if (mp_.n_mmaps_cmax > mp_.n_mmaps_max)
{
assert (mp_.n_mmaps_cmax == mp_.n_mmaps + 1);
mp_.n_mmaps_cmax = mp_.n_mmaps;
}
#endif
mp_.mmapped_mem -= total_size;

int ret __attribute__ ((unused)) = munmap((char *)block, total_size);
Expand Down Expand Up @@ -5371,6 +5382,9 @@ mstate av; size_t n_elements; size_t* sizes; int opts; Void_t* chunks[];
mp_.n_mmaps_max = 0;
mem = _int_malloc(av, size);
mp_.n_mmaps_max = mmx; /* reset mmap */
#if MALLOC_DEBUG
mp_.n_mmaps_cmax = mmx;
#endif
if (mem == 0)
return 0;

Expand Down Expand Up @@ -5696,8 +5710,17 @@ int mALLOPt(param_number, value) int param_number; int value;
res = 0;
else
#endif
mp_.n_mmaps_max = value;
mp_.no_dyn_threshold = 1;
{
#if MALLOC_DEBUG
if (mp_.n_mmaps <= value)
mp_.n_mmaps_cmax = value;
else
mp_.n_mmaps_cmax = mp_.n_mmaps;
#endif

mp_.n_mmaps_max = value;
mp_.no_dyn_threshold = 1;
}
break;

case M_CHECK_ACTION:
Expand Down

0 comments on commit bf98bd2

Please sign in to comment.