[project @ 2000-11-14 14:33:02 by simonmar]
[ghc-hetmet.git] / ghc / rts / MBlock.c
index c9b4500..eae83d2 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: MBlock.c,v 1.10 1999/03/03 19:04:56 sof Exp $
+ * $Id: MBlock.c,v 1.18 2000/09/06 11:12:07 rrt Exp $
  *
  * (c) The GHC Team 1998-1999
  *
@@ -39,7 +39,7 @@
 #include <windows.h>
 #endif
 
-#if freebsd2_TARGET_OS || freebsd3_TARGET_OS
+#if freebsd2_TARGET_OS || freebsd_TARGET_OS
 /* Executable is loaded from      0x0
  * Shared libraries are loaded at 0x2000000
  * Stack is at the top of the address space.  The kernel probably owns
  */
 #define ASK_FOR_MEM_AT 0x50000000
 
+#elif netbsd_TARGET_OS
+/* NetBSD i386 shared libs are at 0x40000000
+ */
+#define ASK_FOR_MEM_AT 0x50000000
+#elif openbsd_TARGET_OS
+#define ASK_FOR_MEM_AT 0x50000000
 #elif linux_TARGET_OS
 /* Any ideas?
  */
 /* guess */
 #define ASK_FOR_MEM_AT 0x50000000
 
+#elif hpux_TARGET_OS
+/* guess */
+#define ASK_FOR_MEM_AT 0x50000000
+
 #elif _WIN32
 /* doesn't matter, we use a reserve/commit algorithm */
 
@@ -91,6 +101,9 @@ getMBlocks(nat n)
                 MAP_FIXED | MAP_PRIVATE, fd, 0);
       close(fd);
   }
+#elif hpux_TARGET_OS
+ ret = mmap(next_request, size, PROT_READ | PROT_WRITE, 
+            MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 #else
   ret = mmap(next_request, size, PROT_READ | PROT_WRITE, 
             MAP_ANON | MAP_PRIVATE, -1, 0);
@@ -141,11 +154,12 @@ char* base_non_committed = (char*)0;
 #define SIZE_RESERVED_POOL  ( 128 * 1024 * 1024 )
 
 /* This predicate should be inlined, really. */
+/* TODO: this only works for a single chunk */
 int
 is_heap_alloced(const void* x)
 {
   return (((char*)(x) >= base_non_committed) && 
-          ((char*)(x) <= (base_non_committed + 128 * 1024 * 1024)));
+          ((char*)(x) <= (base_non_committed + SIZE_RESERVED_POOL)));
 }
 
 void *
@@ -159,6 +173,10 @@ getMBlocks(nat n)
 
   if ( (base_non_committed == 0) || 
        (next_request + size > base_non_committed + SIZE_RESERVED_POOL) ) {
+#ifdef ENABLE_WIN32_DLL_SUPPORT
+    if (base_non_committed)
+        barf("Windows programs can only use 128Mb of heap; sorry!");
+#endif
     base_non_committed = VirtualAlloc ( NULL
                                       , SIZE_RESERVED_POOL
                                      , MEM_RESERVE
@@ -171,7 +189,7 @@ getMBlocks(nat n)
          ret=(void*)-1;
     } else {
     /* The returned pointer is not aligned on a mega-block boundary. Make it. */
-       base_mblocks = (char*)((unsigned)base_non_committed & (unsigned)0xfff00000) + 0x100000;
+       base_mblocks = (char*)((unsigned long)base_non_committed & (unsigned long)0xfff00000) + MBLOCK_SIZE;
 # if 0
        fprintf(stderr, "Dropping %d bytes off of 128M chunk\n", 
                       (unsigned)base_mblocks - (unsigned)base_non_committed);