diff src/ntheap.c @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents 501cfd01ee6d
children
line wrap: on
line diff
--- a/src/ntheap.c	Mon Aug 13 11:19:22 2007 +0200
+++ b/src/ntheap.c	Mon Aug 13 11:20:41 2007 +0200
@@ -38,10 +38,38 @@
 int edata;
 int etext;
 
+/* The major and minor versions of NT.  */
+int nt_major_version;
+int nt_minor_version;
+
+/* Distinguish between Windows NT and Windows 95.  */
+int os_subtype;
+
 /* Cache information describing the NT system for later use.  */
 void
 cache_system_info (void)
 {
+  union 
+    {
+      struct info 
+	{
+	  char  major;
+	  char  minor;
+	  short platform;
+	} info;
+      DWORD data;
+    } version;
+
+  /* Cache the version of the operating system.  */
+  version.data = GetVersion ();
+  nt_major_version = version.info.major;
+  nt_minor_version = version.info.minor;
+
+  if (version.info.platform & 0x8000)
+    os_subtype = OS_WIN95;
+  else
+    os_subtype = OS_NT;
+
   /* Cache page size, allocation unit, processor type, etc.  */
   GetSystemInfo (&sysinfo_cache);
   syspage_mask = sysinfo_cache.dwPageSize - 1;
@@ -80,7 +108,7 @@
   return data_region_end;
 }
 
-static unsigned char *
+static char *
 allocate_heap (void)
 {
   /* The base address for our GNU malloc heap is chosen in conjunction
@@ -120,8 +148,7 @@
      still a pretty decent arena to play in!  */
 
   unsigned long base = 0x01B00000;   /*  27MB */
-  /* Temporary hack for the non-starting problem - use 28 (256Mb) rather than VALBITS (1Gb) */
-  unsigned long end  = 1 << 28;      /* 256MB */
+  unsigned long end  = 1 << VALBITS; /* 256MB */
   void *ptr = NULL;
 
 #define NTHEAP_PROBE_BASE 1
@@ -144,7 +171,7 @@
 		      PAGE_NOACCESS);
 #endif
 
-  return (unsigned char*) ptr;
+  return ptr;
 }
 
 
@@ -220,51 +247,24 @@
   return result;
 }
 
-#if !defined (CANNOT_DUMP) && !defined(HEAP_IN_DATA) && !defined(PDUMP)
+#if !defined (CANNOT_DUMP) && !defined(HEAP_IN_DATA)
 
 /* Recreate the heap from the data that was dumped to the executable.
    EXECUTABLE_PATH tells us where to find the executable.  */
 void
 recreate_heap (char *executable_path)
 {
-  /* First reserve the upper part of our heap.  (We reserve first
-	 because there have been problems in the past where doing the
-	 mapping first has loaded DLLs into the VA space of our heap.)  */
+  unsigned char *tmp;
 
-  /* Query the region at the end of the committed heap */
-  void *tmp;
-  MEMORY_BASIC_INFORMATION info;
-  DWORD size;
-  unsigned char* base = get_heap_end ();
-  unsigned char* end  = base + get_reserved_heap_size () - get_committed_heap_size ();
-  VirtualQuery (base, &info, sizeof info);
-  if (info.State != MEM_FREE)
-	{
-	  /* Oops, something has already reserved or commited it, nothing we can do but exit */
-	  char buf[256];
-	  wsprintf(buf,
-			   "XEmacs cannot start because the memory region required by the heap is not available.\n"
-			   "(BaseAddress = 0x%lx, AllocationBase = 0x%lx, Size = 0x%lx, State = %s, Type = %s)",
-			   info.BaseAddress, info.AllocationBase, info.RegionSize,
-			   info.State == MEM_COMMIT ? "COMMITED" : "RESERVED",
-			   info.Type == MEM_IMAGE ? "IMAGE" : info.Type == MEM_MAPPED ? "MAPPED" : "PRIVATE");
-	  MessageBox(NULL, buf, "XEmacs", MB_OK | MB_ICONSTOP);
-	  exit(1);
-	}
-
-  /* Now try and reserve as much as possible */
-  size = min (info.RegionSize, end - base);
-  tmp = VirtualAlloc (base, size, MEM_RESERVE, PAGE_NOACCESS);
+  /* First reserve the upper part of our heap.  (We reserve first
+     because there have been problems in the past where doing the
+     mapping first has loaded DLLs into the VA space of our heap.)  */
+  tmp = VirtualAlloc ((void *) get_heap_end (),
+		      get_reserved_heap_size () - get_committed_heap_size (),
+		      MEM_RESERVE,
+		      PAGE_NOACCESS);
   if (!tmp)
-	{
-	  /* Can't reserve it, nothing we can do but exit */
-	  char buf[256];
-	  wsprintf(buf,
-			   "XEmacs cannot start because it couldn't reserve space required for the heap.\n"
-			   "(VirtualAlloc at 0x%lx of 0x%lx failed (%d))", base, size, GetLastError());
-	  MessageBox(NULL, buf, "XEmacs", MB_OK | MB_ICONSTOP);
-	  exit (1);
-	}
+    exit (1);
 
   /* We read in the data for the .bss section from the executable
      first and map in the heap from the executable second to prevent