diff options
author | Roland McGrath <roland@gnu.org> | 2007-05-15 20:34:30 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2007-05-15 20:34:30 +0000 |
commit | 18b86433d08e3df2a2820ede370d52bbda55eb74 (patch) | |
tree | 59347eb227c205dbf728f7177212f81a9ca48467 /malloc | |
parent | e169ea9b569d9e9a60bde4aebe960591bacaf4ef (diff) |
Updated to fedora-glibc-20070515T2025
Diffstat (limited to 'malloc')
-rw-r--r-- | malloc/arena.c | 3 | ||||
-rw-r--r-- | malloc/hooks.c | 11 | ||||
-rw-r--r-- | malloc/malloc.c | 54 |
3 files changed, 59 insertions, 9 deletions
diff --git a/malloc/arena.c b/malloc/arena.c index ce64335567..9e3ff47347 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -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; diff --git a/malloc/hooks.c b/malloc/hooks.c index 8346e73453..cde3e18cbd 100644 --- a/malloc/hooks.c +++ b/malloc/hooks.c @@ -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. @@ -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; @@ -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; @@ -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; diff --git a/malloc/malloc.c b/malloc/malloc.c index 8ae941c597..e061db94d6 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -2125,22 +2125,37 @@ typedef struct malloc_chunk* mbinptr; #define NBINS 128 #define NSMALLBINS 64 -#define SMALLBIN_WIDTH 8 -#define MIN_LARGE_SIZE 512 +#define SMALLBIN_WIDTH MALLOC_ALIGNMENT +#define MIN_LARGE_SIZE (NSMALLBINS * SMALLBIN_WIDTH) #define in_smallbin_range(sz) \ ((unsigned long)(sz) < (unsigned long)MIN_LARGE_SIZE) -#define smallbin_index(sz) (((unsigned)(sz)) >> 3) +#define smallbin_index(sz) \ + (SMALLBIN_WIDTH == 16 ? (((unsigned)(sz)) >> 4) : (((unsigned)(sz)) >> 3)) -#define largebin_index(sz) \ -(((((unsigned long)(sz)) >> 6) <= 32)? 56 + (((unsigned long)(sz)) >> 6): \ +#define largebin_index_32(sz) \ +(((((unsigned long)(sz)) >> 6) <= 38)? 56 + (((unsigned long)(sz)) >> 6): \ ((((unsigned long)(sz)) >> 9) <= 20)? 91 + (((unsigned long)(sz)) >> 9): \ ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \ ((((unsigned long)(sz)) >> 15) <= 4)? 119 + (((unsigned long)(sz)) >> 15): \ ((((unsigned long)(sz)) >> 18) <= 2)? 124 + (((unsigned long)(sz)) >> 18): \ 126) +// XXX It remains to be seen whether it is good to keep the widths of +// XXX the buckets the same or whether it should be scaled by a factor +// XXX of two as well. +#define largebin_index_64(sz) \ +(((((unsigned long)(sz)) >> 6) <= 48)? 48 + (((unsigned long)(sz)) >> 6): \ + ((((unsigned long)(sz)) >> 9) <= 20)? 91 + (((unsigned long)(sz)) >> 9): \ + ((((unsigned long)(sz)) >> 12) <= 10)? 110 + (((unsigned long)(sz)) >> 12): \ + ((((unsigned long)(sz)) >> 15) <= 4)? 119 + (((unsigned long)(sz)) >> 15): \ + ((((unsigned long)(sz)) >> 18) <= 2)? 124 + (((unsigned long)(sz)) >> 18): \ + 126) + +#define largebin_index(sz) \ + (SIZE_SZ == 8 ? largebin_index_64 (sz) : largebin_index_32 (sz)) + #define bin_index(sz) \ ((in_smallbin_range(sz)) ? smallbin_index(sz) : largebin_index(sz)) @@ -2343,6 +2358,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 @@ -2858,7 +2876,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) <= @@ -3456,6 +3475,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); @@ -5371,6 +5397,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; @@ -5696,8 +5725,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: |