From afe817741cc8e509c9c3b2fdfca7c2b7ac4c994a Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 9 Aug 2011 12:00:27 +0000 Subject: * 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. --- winsup/cygwin/heap.cc | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'winsup/cygwin/heap.cc') 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, -- cgit v1.2.3