From: Eli Zaretskii Date: Fri, 29 Apr 2011 14:23:44 +0000 (+0300) Subject: Allow the Windows build to use upto 2GB of heap. X-Git-Tag: emacs-pretest-24.0.90~104^3~60 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=fab624aa3a159b3d91fae009634dd0875a5b0162;p=emacs.git Allow the Windows build to use upto 2GB of heap. src/w32heap.c (allocate_heap) [USE_LISP_UNION_TYPE || USE_LSB_TAG]: New version that can reserve upto 2GB of heap space. etc/NEWS: Mention the new feature. --- diff --git a/etc/NEWS b/etc/NEWS index b9743649b93..c3e746127f1 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -139,6 +139,11 @@ starting from the first line of text below the header line. ** The nextstep port can have different modifiers for the left and right alt/option key by customizing the value for ns-right-alternate-modifier. +** The MS-Windows port can now use more than 500MB of heap. +Depending on the available virtual memory, Emacs on Windows can now +have up to 2GB of heap space. This allows, e.g., to visit several +large (> 256MB) files in the same session. + * Installation Changes in Emacs 23.2 diff --git a/src/ChangeLog b/src/ChangeLog index b6f962f4523..42d9185e0dd 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2011-04-29 Eli Zaretskii + + * w32heap.c (allocate_heap) [USE_LISP_UNION_TYPE || USE_LSB_TAG]: + New version that can reserve upto 2GB of heap space. + 2011-04-26 Chong Yidong * nsfns.m (Fns_read_file_name): Doc fix (Bug#8534). diff --git a/src/w32heap.c b/src/w32heap.c index b5b18919a4a..91bc8133b20 100644 --- a/src/w32heap.c +++ b/src/w32heap.c @@ -119,6 +119,7 @@ get_data_end (void) return data_region_end; } +#if !defined (USE_LISP_UNION_TYPE) && !defined (USE_LSB_TAG) static char * allocate_heap (void) { @@ -145,9 +146,31 @@ allocate_heap (void) return ptr; } +#else /* USE_LISP_UNION_TYPE || USE_LSB_TAG */ +static char * +allocate_heap (void) +{ + unsigned long size = 0x80000000; /* start by asking for 2GB */ + void *ptr = NULL; + + while (!ptr && size > 0x00100000) + { + reserved_heap_size = size; + ptr = VirtualAlloc (NULL, + get_reserved_heap_size (), + MEM_RESERVE, + PAGE_NOACCESS); + size -= 0x00800000; /* if failed, decrease request by 8MB */ + } + + return ptr; +} +#endif /* USE_LISP_UNION_TYPE || USE_LSB_TAG */ -/* Emulate Unix sbrk. */ +/* Emulate Unix sbrk. Note that ralloc.c expects the return value to + be the address of the _start_ (not end) of the new block in case of + success, and zero (not -1) in case of failure. */ void * sbrk (unsigned long increment) {