diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2011-08-09 12:00:27 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2011-08-09 12:00:27 +0000 |
commit | afe817741cc8e509c9c3b2fdfca7c2b7ac4c994a (patch) | |
tree | cba5a71faf4fbd9f2e05fea7168695dd4827579d /winsup/cygwin/heap.cc | |
parent | c29da54058ab28475e1a8e31c67abb8e2168b44f (diff) | |
download | cygnal-afe817741cc8e509c9c3b2fdfca7c2b7ac4c994a.tar.gz cygnal-afe817741cc8e509c9c3b2fdfca7c2b7ac4c994a.tar.bz2 cygnal-afe817741cc8e509c9c3b2fdfca7c2b7ac4c994a.zip |
* heap.cc (eval_initial_heap_size): New function fetching the heap
size from the LoaderFlags field in the PE/COFF header.
(heap_init): Call eval_initial_heap_size rather than
cygwin_shared->heap_chunk_size to fetch the initial heap size.
* shared.cc (shared_info::heap_chunk_size): Remove.
* shared_info.h (class shared_info): Drop heap_chunk member.
(CURR_SHARED_MAGIC): Update.
Diffstat (limited to 'winsup/cygwin/heap.cc')
-rw-r--r-- | winsup/cygwin/heap.cc | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/winsup/cygwin/heap.cc b/winsup/cygwin/heap.cc index 977b93b4d..d58a4cfcc 100644 --- a/winsup/cygwin/heap.cc +++ b/winsup/cygwin/heap.cc @@ -56,6 +56,30 @@ eval_start_address () return start_address; } +static unsigned +eval_initial_heap_size () +{ + PIMAGE_DOS_HEADER dosheader; + PIMAGE_NT_HEADERS32 ntheader; + unsigned size; + + dosheader = (PIMAGE_DOS_HEADER) GetModuleHandle (NULL); + ntheader = (PIMAGE_NT_HEADERS32) ((PBYTE) dosheader + dosheader->e_lfanew); + /* LoaderFlags is an obsolete DWORD member of the PE/COFF file header. + It's value is ignored by the loader, so we're free to use it for + Cygwin. If it's 0, we default to the usual 384 Megs. Otherwise, + we use it as the default initial heap size in megabyte. Valid values + are between 4 and 2048 Megs. */ + size = ntheader->OptionalHeader.LoaderFlags; + if (size == 0) + size = 384; + else if (size < 4) + size = 4; + else if (size > 2048) + size = 2048; + return size << 20; +} + /* Initialize the heap at process start up. */ void heap_init () @@ -73,7 +97,7 @@ heap_init () SIZE_T ret; MEMORY_BASIC_INFORMATION mbi; - cygheap->user_heap.chunk = cygwin_shared->heap_chunk_size (); + cygheap->user_heap.chunk = eval_initial_heap_size (); do { cygheap->user_heap.base = VirtualAlloc ((LPVOID) start_address, |