]> code.delx.au - gnu-emacs/blobdiff - src/w32heap.c
(syms_of_buffer): Doc fix.
[gnu-emacs] / src / w32heap.c
index 28d44e54b218f410cf13b245a1465c81129783b5..8565999b4599366d6198f9655fc9dfff5ae7c42a 100644 (file)
@@ -1,4 +1,4 @@
-/* Heap management routines for GNU Emacs on Windows NT.
+/* Heap management routines for GNU Emacs on the Microsoft W32 API.
    Copyright (C) 1994 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
@@ -26,7 +26,7 @@ Boston, MA 02111-1307, USA.
 #include <stdlib.h>
 #include <stdio.h>
 
-#include "ntheap.h"
+#include "w32heap.h"
 #include "lisp.h"  /* for VALMASK */
 
 /* This gives us the page size and the size of the allocation unit on NT.  */
@@ -38,8 +38,8 @@ int edata;
 int etext;
 
 /* The major and minor versions of NT.  */
-int nt_major_version;
-int nt_minor_version;
+int w32_major_version;
+int w32_minor_version;
 
 /* Cache information describing the NT system for later use.  */
 void
@@ -58,14 +58,21 @@ cache_system_info (void)
 
   /* Cache the version of the operating system.  */
   version.data = GetVersion ();
-  nt_major_version = version.info.major;
-  nt_minor_version = version.info.minor;
+  w32_major_version = version.info.major;
+  w32_minor_version = version.info.minor;
 
   /* Cache page size, allocation unit, processor type, etc.  */
   GetSystemInfo (&sysinfo_cache);
   syspage_mask = sysinfo_cache.dwPageSize - 1;
 }
 
+/* Emulate getpagesize.  */
+int
+getpagesize (void)
+{
+  return sysinfo_cache.dwPageSize;
+}
+
 /* Round ADDRESS up to be aligned with ALIGN.  */
 unsigned char *
 round_to_next (unsigned char *address, unsigned long align)
@@ -78,6 +85,10 @@ round_to_next (unsigned char *address, unsigned long align)
   return (unsigned char *) (tmp * align);
 }
 
+/* Force zero initialized variables to be placed in the .data segment;
+   MSVC 5.0 otherwise places them in .bss, which breaks the dumping code.  */
+#pragma data_seg(".data")
+
 /* Info for keeping track of our heap.  */
 unsigned char *data_region_base = NULL;
 unsigned char *data_region_end = NULL;
@@ -107,12 +118,12 @@ allocate_heap (void)
      the initial default process heap size and the executable image base
      address.  The link settings and the malloc heap base below must all
      correspond; the relationship between these values depends on how NT
-     and Win95 arrange the virtual address space for a process (and on
+     and Windows 95 arrange the virtual address space for a process (and on
      the size of the code and data segments in temacs.exe).
 
      The most important thing is to make base address for the executable
      image high enough to leave enough room between it and the 4MB floor
-     of the process address space on Win95 for the primary thread stack,
+     of the process address space on Windows 95 for the primary thread stack,
      the process default heap, and other assorted odds and ends
      (eg. environment strings, private system dll memory etc) that are
      allocated before temacs has a chance to grab its malloc arena.  The
@@ -131,20 +142,37 @@ allocate_heap (void)
      size could be roughly double, so if we allow 4MB for the executable
      we will have plenty of room for expansion.
 
-     Thus we set the malloc heap base to 20MB.  Since Emacs now leaves
+     Thus we would like to set the malloc heap base to 20MB.  However,
+     Windows 95 refuses to allocate the heap starting at this address, so we
+     set the base to 27MB to make it happy.  Since Emacs now leaves
      28 bits available for pointers, this lets us use the remainder of
-     the region below the 256MB line for our malloc arena - 236MB is
-     still a pretty decent arena to play in! */
+     the region below the 256MB line for our malloc arena - 229MB is
+     still a pretty decent arena to play in!  */
 
-  unsigned long base = 0x01400000; /* 20MB */
+  unsigned long base = 0x01B00000;   /*  27MB */
   unsigned long end  = 1 << VALBITS; /* 256MB */
+  void *ptr = NULL;
 
+#if NTHEAP_PROBE_BASE /* This is never normally defined */
+  /* Try various addresses looking for one the kernel will let us have.  */
+  while (!ptr && (base < end))
+    {
+      reserved_heap_size = end - base;
+      ptr = VirtualAlloc ((void *) base,
+                         get_reserved_heap_size (),
+                         MEM_RESERVE,
+                         PAGE_NOACCESS);
+      base += 0x00100000;  /* 1MB increment */
+    }
+#else
   reserved_heap_size = end - base;
+  ptr = VirtualAlloc ((void *) base,
+                     get_reserved_heap_size (),
+                     MEM_RESERVE,
+                     PAGE_NOACCESS);
+#endif
 
-  return VirtualAlloc ((void *) base,
-                      get_reserved_heap_size (),
-                      MEM_RESERVE,
-                      PAGE_NOACCESS);
+  return ptr;
 }