From d8f87fba651a721601fa86d1e4b95d8ea17d9e79 Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Thu, 18 Mar 2004 19:30:51 +0000 Subject: [PATCH] * child_info.h (CURR_CHILD_INFO_MAGIC): Reset to new value. (child_info::cygheap_alloc_sz): New field. * cygheap.cc (init_cheap): Reduce size of cygwin stack until minimal hit when attempting initial allocation. (cygheap_setup_for_child): Use alloc_sz to create secondary memory mapped entry. Store alloc_sz in cygheap_alloc_sz. (cygheap_fixup_in_child): Use cygheap_alloc_sz to map parent's cygheap. * cygheap.h (_CYGHEAPSIZE_SLOP): New define. (CYGHEAPSIZE): Use _CYGHEAPSIZE_SLOP. --- winsup/cygwin/ChangeLog | 12 ++++++++++++ winsup/cygwin/child_info.h | 3 ++- winsup/cygwin/cygheap.cc | 23 ++++++++++++++++------- winsup/cygwin/cygheap.h | 4 +++- 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 83c970a6a..32bdb892c 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,15 @@ +2004-03-18 Christopher Faylor + + * child_info.h (CURR_CHILD_INFO_MAGIC): Reset to new value. + (child_info::cygheap_alloc_sz): New field. + * cygheap.cc (init_cheap): Reduce size of cygwin stack until minimal + hit when attempting initial allocation. + (cygheap_setup_for_child): Use alloc_sz to create secondary memory + mapped entry. Store alloc_sz in cygheap_alloc_sz. + (cygheap_fixup_in_child): Use cygheap_alloc_sz to map parent's cygheap. + * cygheap.h (_CYGHEAPSIZE_SLOP): New define. + (CYGHEAPSIZE): Use _CYGHEAPSIZE_SLOP. + 2004-03-18 Corinna Vinschen * fhandler_proc.cc (format_proc_meminfo): On NT, try to figure out diff --git a/winsup/cygwin/child_info.h b/winsup/cygwin/child_info.h index 4088477fc..25591d835 100644 --- a/winsup/cygwin/child_info.h +++ b/winsup/cygwin/child_info.h @@ -29,7 +29,7 @@ enum #define EXEC_MAGIC_SIZE sizeof(child_info) -#define CURR_CHILD_INFO_MAGIC 0x4239088U +#define CURR_CHILD_INFO_MAGIC 0x70172124U /* NOTE: Do not make gratuitous changes to the names or organization of the below class. The layout is checksummed to determine compatibility between @@ -49,6 +49,7 @@ public: HANDLE pppid_handle; init_cygheap *cygheap; void *cygheap_max; + DWORD cygheap_alloc_sz; HANDLE cygheap_h; unsigned fhandler_union_cb; }; diff --git a/winsup/cygwin/cygheap.cc b/winsup/cygwin/cygheap.cc index 5da6fa692..b4ecf89e7 100644 --- a/winsup/cygwin/cygheap.cc +++ b/winsup/cygwin/cygheap.cc @@ -28,6 +28,7 @@ init_cygheap NO_COPY *cygheap; void NO_COPY *cygheap_max; static NO_COPY muto *cygheap_protect; +static NO_COPY DWORD alloc_sz; struct cygheap_entry { @@ -50,13 +51,18 @@ static void __stdcall _cfree (void *ptr) __attribute__((regparm(1))); static void init_cheap () { - cygheap = (init_cygheap *) VirtualAlloc ((void *) &_cygheap_start, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS); + for (cygheap = NULL, alloc_sz = CYGHEAPSIZE; + !cygheap && alloc_sz > CYGHEAPSIZE_MIN; + alloc_sz -= 2 * (1024 * 1024)) + cygheap = (init_cygheap *) VirtualAlloc ((void *) &_cygheap_start, alloc_sz, + MEM_RESERVE, PAGE_NOACCESS); if (!cygheap) { MEMORY_BASIC_INFORMATION m; if (!VirtualQuery ((LPCVOID) &_cygheap_start, &m, sizeof m)) system_printf ("couldn't get memory info, %E"); - system_printf ("Couldn't reserve space for cygwin's heap, %E"); + system_printf ("Couldn't reserve %d bytes of space for cygwin's heap, %E", + alloc_sz); api_fatal ("AllocationBase %p, BaseAddress %p, RegionSize %p, State %p\n", m.AllocationBase, m.BaseAddress, m.RegionSize, m.State); } @@ -79,13 +85,13 @@ cygheap_setup_for_child (child_info *ci, bool dup_later) void *newcygheap; cygheap_protect->acquire (); unsigned n = (char *) cygheap_max - (char *) cygheap; - unsigned size = CYGHEAPSIZE; + unsigned size = alloc_sz; if (size < n) size = n + (128 * 1024); ci->cygheap_h = CreateFileMapping (INVALID_HANDLE_VALUE, &sec_none, CFMAP_OPTIONS, 0, size, NULL); if (!ci->cygheap_h) - api_fatal ("Couldn't create heap for child, size %d, %E", CYGHEAPSIZE); + api_fatal ("Couldn't create heap for child, size %d, %E", size); newcygheap = MapViewOfFileEx (ci->cygheap_h, MVMAP_OPTIONS, 0, 0, 0, NULL); ProtectHandle1INH (ci->cygheap_h, passed_cygheap_h); if (!dup_later) @@ -93,6 +99,7 @@ cygheap_setup_for_child (child_info *ci, bool dup_later) cygheap_protect->release (); ci->cygheap = cygheap; ci->cygheap_max = cygheap_max; + ci->cygheap_alloc_sz = size; return newcygheap; } @@ -129,7 +136,8 @@ cygheap_fixup_in_child (bool execed) newaddr = MapViewOfFileEx (child_proc_info->cygheap_h, MVMAP_OPTIONS, 0, 0, 0, NULL); DWORD n = (DWORD) cygheap_max - (DWORD) cygheap; /* Reserve cygwin heap in same spot as parent */ - if (!VirtualAlloc (cygheap, CYGHEAPSIZE, MEM_RESERVE, PAGE_NOACCESS)) + if (!VirtualAlloc (cygheap, child_proc_info->cygheap_alloc_sz, + MEM_RESERVE, PAGE_NOACCESS)) { MEMORY_BASIC_INFORMATION m; memset (&m, 0, sizeof m); @@ -205,8 +213,9 @@ _csbrk (int sbs) /* nothing to do */; else if (!VirtualAlloc (prebrk, (DWORD) sbs, MEM_COMMIT, PAGE_READWRITE)) { - malloc_printf ("couldn't commit memory for cygwin heap, prebrk %p, size %d, heapsize now %d, max heap size %d, %E", - prebrk, sbs, (char *) cygheap_max - (char *) cygheap, CYGHEAPSIZE); + malloc_printf ("couldn't commit memory for cygwin heap, prebrk %p, size %d, heapsize now %d, max heap size %u, %E", + prebrk, sbs, (char *) cygheap_max - (char *) cygheap, + alloc_sz); __seterrno (); cygheap_max = (char *) cygheap_max - sbs; return NULL; diff --git a/winsup/cygwin/cygheap.h b/winsup/cygwin/cygheap.h index 518e9dce6..864fa9729 100644 --- a/winsup/cygwin/cygheap.h +++ b/winsup/cygwin/cygheap.h @@ -272,7 +272,9 @@ struct init_cygheap void close_ctty (); }; -#define CYGHEAPSIZE (sizeof (init_cygheap) + (20000 * sizeof (fhandler_union)) + (32 * 1024 * 1024)) +#define _CYGHEAPSIZE_SLOP (32 * 1024 * 1024) +#define CYGHEAPSIZE (sizeof (init_cygheap) + (20000 * sizeof (fhandler_union)) + _CYGHEAPSIZE_SLOP) +#define CYGHEAPSIZE_MIN (sizeof (init_cygheap) + (10000 * sizeof (fhandler_union))) extern init_cygheap *cygheap; extern void *cygheap_max;