(shell-command-on-region): Doc fix.
[bpt/emacs.git] / src / w32heap.c
index 8565999..8051ce1 100644 (file)
@@ -41,6 +41,9 @@ int etext;
 int w32_major_version;
 int w32_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)
@@ -61,6 +64,11 @@ cache_system_info (void)
   w32_major_version = version.info.major;
   w32_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;
@@ -85,10 +93,6 @@ 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;
@@ -153,7 +157,8 @@ allocate_heap (void)
   unsigned long end  = 1 << VALBITS; /* 256MB */
   void *ptr = NULL;
 
-#if NTHEAP_PROBE_BASE /* This is never normally defined */
+#define NTHEAP_PROBE_BASE 1
+#if NTHEAP_PROBE_BASE
   /* Try various addresses looking for one the kernel will let us have.  */
   while (!ptr && (base < end))
     {
@@ -271,13 +276,16 @@ recreate_heap (char *executable_path)
                      MEM_RESERVE,
                      PAGE_NOACCESS);
   if (!tmp)
-    exit (1);
+    w32_fatal_reload_error ("Reserving upper heap address space.");
 
   /* We read in the data for the .bss section from the executable
      first and map in the heap from the executable second to prevent
      any funny interactions between file I/O and file mapping.  */
   read_in_bss (executable_path);
   map_in_heap (executable_path);
+
+  /* Update system version information to match current system.  */
+  cache_system_info ();
 }
 
 /* Round the heap up to the given alignment.  */
@@ -293,3 +301,26 @@ round_heap (unsigned long align)
   if (need_to_alloc) 
     sbrk (need_to_alloc);
 }
+
+#if (_MSC_VER >= 1000)
+
+/* MSVC 4.2 invokes these functions from mainCRTStartup to initialize
+   a heap via HeapCreate.  They are normally defined by the runtime,
+   but we override them here so that the unnecessary HeapCreate call
+   is not performed.  */
+
+int __cdecl
+_heap_init (void)
+{
+  /* Stepping through the assembly indicates that mainCRTStartup is
+     expecting a nonzero success return value.  */
+  return 1;
+}
+
+void __cdecl
+_heap_term (void)
+{
+  return;
+}
+
+#endif