changeset 11943:ea533622fb8b

(reserved_heap_size,allocate_heap): Defined. (sbrk): Use allocate_heap.
author Geoff Voelker <voelker@cs.washington.edu>
date Fri, 26 May 1995 05:27:52 +0000
parents 04cc0b15ef74
children 89ccf3b3208d
files src/w32heap.c
diffstat 1 files changed, 52 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/w32heap.c	Fri May 26 05:26:51 1995 +0000
+++ b/src/w32heap.c	Fri May 26 05:27:52 1995 +0000
@@ -76,6 +76,7 @@
 unsigned char *data_region_base = NULL;
 unsigned char *data_region_end = NULL;
 unsigned long  data_region_size = 0;
+unsigned long  reserved_heap_size = 0;
 
 /* The start of the data segment.  */
 unsigned char *
@@ -91,6 +92,56 @@
   return data_region_end;
 }
 
+
+#ifdef WINDOWS95
+static char *
+allocate_heap (void)
+{
+  unsigned long base = 0x00030000;
+  unsigned long end  = 0x00D00000;
+
+  reserved_heap_size = end - base;
+
+  return VirtualAlloc ((void *) base,
+		       get_reserved_heap_size (),
+		       MEM_RESERVE,
+		       PAGE_NOACCESS);
+}
+#else  
+static char *
+allocate_heap (void)
+{
+  unsigned long start     = 0x400000;
+  unsigned long stop      = 0xF00000;
+  unsigned long increment = 0x100000;
+  char *ptr, *begin = NULL, *end = NULL;
+  int i;
+
+  for (i = start; i < stop; i += increment) 
+    {
+      ptr = VirtualAlloc ((void *) i, increment, MEM_RESERVE, PAGE_NOACCESS);
+      if (ptr) 
+	begin = begin ? begin : ptr;
+      else if (begin)
+	{
+	  end = ptr;
+	  break;
+	}
+    }
+
+  if (begin && !end)
+    end = (char *) i;
+  
+  if (!begin)
+    /* We couldn't allocate any memory for the heap.  Exit.  */
+    exit (-2);
+
+  reserved_heap_size = end - begin;
+  return begin;
+}
+#endif
+
+
 /* Emulate Unix sbrk.  */
 void *
 sbrk (unsigned long increment)
@@ -101,10 +152,7 @@
   /* Allocate our heap if we haven't done so already.  */
   if (!data_region_base) 
     {
-      data_region_base = VirtualAlloc ((void *) get_data_region_base (),
-				       get_reserved_heap_size (),
-				       MEM_RESERVE,
-				       PAGE_NOACCESS);
+      data_region_base = allocate_heap ();
       if (!data_region_base)
 	return NULL;