Module: wine Branch: master Commit: c614a2481a9f8377103d203e85dde926fa45431a URL: http://source.winehq.org/git/wine.git/?a=commit;h=c614a2481a9f8377103d203e85...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Sep 3 17:22:13 2008 +0200
libwine: Reserve some malloc space on Solaris before we start mapping other things.
---
libs/wine/mmap.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/libs/wine/mmap.c b/libs/wine/mmap.c index 8b79580..ff117cc 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 )