From c614a2481a9f8377103d203e85dde926fa45431a Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 3 Sep 2008 17:22:13 +0200 Subject: [PATCH] libwine: Reserve some malloc space on Solaris before we start mapping other things. --- libs/wine/mmap.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c index 8b79580d5a8..ff117cccdfb 100644 --- a/libs/wine/mmap.c +++ b/libs/wine/mmap.c @@ -286,7 +286,30 @@ static void reserve_area( void *addr, void *end ) } #endif } + + +/*********************************************************************** + * reserve_malloc_space + * + * Solaris malloc is not smart enough to obtain space through mmap(), so try to make + * sure that there is some available sbrk() space before we reserve other things. + */ +static void reserve_malloc_space( size_t size ) +{ +#ifdef __sun + size_t i, count = size / 1024; + void **ptrs = malloc( count * sizeof(ptrs[0]) ); + + if (!ptrs) return; + + for (i = 0; i < count; i++) if (!(ptrs[i] = malloc( 1024 ))) break; + if (i--) /* free everything except the last one */ + while (i) free( ptrs[--i] ); + free( ptrs ); #endif +} + +#endif /* __i386__ */ /*********************************************************************** @@ -325,6 +348,8 @@ void mmap_init(void) char * const stack_ptr = &stack; char *user_space_limit = (char *)0x7ffe0000; + reserve_malloc_space( 8 * 1024 * 1024 ); + /* check for a reserved area starting at the user space limit */ /* to avoid wasting time trying to allocate it again */ LIST_FOR_EACH( ptr, &reserved_areas )