[project @ 1999-03-09 14:27:06 by sewardj]
[ghc-hetmet.git] / ghc / rts / MBlock.c
index 249493a..c9b4500 100644 (file)
@@ -1,5 +1,7 @@
 /* -----------------------------------------------------------------------------
- * $Id: MBlock.c,v 1.5 1999/01/18 09:20:08 sof Exp $
+ * $Id: MBlock.c,v 1.10 1999/03/03 19:04:56 sof Exp $
+ *
+ * (c) The GHC Team 1998-1999
  *
  * MegaBlock Allocator Interface.  This file contains all the dirty
  * architecture-dependent hackery required to get a chunk of aligned
 #include <sys/types.h>
 #endif
 
-#ifdef HAVE_SYS_MMAN_H
-#include <sys/mman.h>
+#ifndef mingw32_TARGET_OS
+# ifdef HAVE_SYS_MMAN_H
+# include <sys/mman.h>
+# endif
 #endif
 
 #ifdef HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
 
-#if cygwin32_TARGET_OS
+#if HAVE_WINDOWS_H
 #include <windows.h>
 #endif
 
 /* guess */
 #define ASK_FOR_MEM_AT 0x50000000
 
+#elif osf3_TARGET_OS
+/* guess */
+#define ASK_FOR_MEM_AT 0x50000000
+
+#elif _WIN32
+/* doesn't matter, we use a reserve/commit algorithm */
+
 #else
 #error Dont know where to get memory from on this architecture
 /* ToDo: memory locations on other architectures */
@@ -66,7 +77,6 @@ getMBlock(void)
 }
 
 #ifndef _WIN32
-
 void *
 getMBlocks(nat n)
 {
@@ -125,19 +135,28 @@ getMBlocks(nat n)
 
 */
 
+char* base_non_committed = (char*)0;
+
+/* Reserve VM 128M at the time to try to minimise the slop cost. */
+#define SIZE_RESERVED_POOL  ( 128 * 1024 * 1024 )
+
+/* This predicate should be inlined, really. */
+int
+is_heap_alloced(const void* x)
+{
+  return (((char*)(x) >= base_non_committed) && 
+          ((char*)(x) <= (base_non_committed + 128 * 1024 * 1024)));
+}
+
 void *
 getMBlocks(nat n)
 {
-  static char* base_non_committed = (char*)0;
   static char* base_mblocks       = (char*)0;
   static char* next_request       = (char*)0;
   void* ret                       = (void*)0;
 
   lnat size = MBLOCK_SIZE * n;
 
-  /* Reserve VM 128M at the time to try to minimise the slop cost. */
-#define SIZE_RESERVED_POOL  ( 128 * 1024 * 1024 )
-
   if ( (base_non_committed == 0) || 
        (next_request + size > base_non_committed + SIZE_RESERVED_POOL) ) {
     base_non_committed = VirtualAlloc ( NULL
@@ -146,7 +165,7 @@ getMBlocks(nat n)
                                      , PAGE_READWRITE
                                      );
     if ( base_non_committed == 0 ) {
-# ifdef DEBUG
+# if 1 /*def DEBUG*/
          fprintf(stderr, "getMBlocks: VirtualAlloc failed with: %d\n", GetLastError());
 # endif
          ret=(void*)-1;
@@ -159,7 +178,7 @@ getMBlocks(nat n)
 # endif
 
        if ( ((char*)base_mblocks + size) > ((char*)base_non_committed + SIZE_RESERVED_POOL) ) {
-# ifdef DEBUG
+# if 1 /*def DEBUG*/
           fprintf(stderr, "oops, committed too small a region to start with.");
 # endif
          ret=(void*)-1;
@@ -172,7 +191,7 @@ getMBlocks(nat n)
   if ( ret != (void*)-1 ) {
      ret = VirtualAlloc(next_request, size, MEM_COMMIT, PAGE_READWRITE);
      if (ret == NULL) {
-# ifdef DEBUG
+# if 1 /*def DEBUG*/
         fprintf(stderr, "getMBlocks: VirtualAlloc failed with: %d\n", GetLastError());
 # endif
         ret=(void*)-1;