From e404fb16fc35210219159a446f7c993760a37316 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 22 Aug 2006 06:19:12 +0000 Subject: * malloc/malloc.c (DEFAULT_MMAP_THRESHOLD_MAX): For 32-bit platforms define as 1MB. For 64-bit platforms as 32MB. The lower limit is needed to avoid the exploding of the address space requirement for secondary heaps. * malloc/arena.c (HEAP_MAX_SIZE): Define using DEFAULT_MMAP_THRESHOLD_MAX if it is defined. --- malloc/arena.c | 6 +++++- malloc/malloc.c | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) (limited to 'malloc') diff --git a/malloc/arena.c b/malloc/arena.c index 6f0a9df8f1..e96b3b42a6 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -24,7 +24,11 @@ #define HEAP_MIN_SIZE (32*1024) #ifndef HEAP_MAX_SIZE -#define HEAP_MAX_SIZE (1024*1024) /* must be a power of two */ +# ifdef DEFAULT_MMAP_THRESHOLD_MAX +# define HEAP_MAX_SIZE DEFAULT_MMAP_THRESHOLD_MAX +# else +# define HEAP_MAX_SIZE (1024*1024) /* must be a power of two */ +# endif #endif /* HEAP_MIN_SIZE and HEAP_MAX_SIZE limit the size of mmap()ed heaps diff --git a/malloc/malloc.c b/malloc/malloc.c index b1f813efbe..7ad26af069 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -259,6 +259,7 @@ #ifdef _LIBC #include +#include #endif #ifdef __cplusplus @@ -1424,7 +1425,15 @@ int __posix_memalign(void **, size_t, size_t); #endif #ifndef DEFAULT_MMAP_THRESHOLD_MAX -#define DEFAULT_MMAP_THRESHOLD_MAX (8 * 1024 * 1024 * sizeof(long)) + /* For 32-bit platforms we cannot increase the maximum mmap + threshold much because it is also the minimum value for the + maximum heap size and its alignment. Going above 1MB wastes too + much address space. */ +# if __WORDSIZE == 32 +# define DEFAULT_MMAP_THRESHOLD_MAX (1024 * 1024) +# else +# define DEFAULT_MMAP_THRESHOLD_MAX (8 * 1024 * 1024 * sizeof(long)) +# endif #endif /* @@ -2867,6 +2876,7 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; char* mm; /* return value from mmap call*/ + try_mmap: /* Round up size to nearest page. For mmapped chunks, the overhead is one SIZE_SZ unit larger than for normal chunks, because there @@ -2996,6 +3006,9 @@ static Void_t* sYSMALLOc(nb, av) INTERNAL_SIZE_T nb; mstate av; set_foot(old_top, (old_size + 2*SIZE_SZ)); } } + else + /* We can at least try to use to mmap memory. */ + goto try_mmap; } else { /* av == main_arena */ -- cgit 1.4.1