/* -----------------------------------------------------------------------------
- * $Id: MBlock.h,v 1.16 2002/11/22 06:54:05 matthewc Exp $
+ * $Id: MBlock.h,v 1.20 2004/08/13 13:10:10 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
#ifndef __MBLOCK_H__
#define __MBLOCK_H__
-extern lnat mblocks_allocated;
+
+extern lnat RTS_VAR(mblocks_allocated);
extern void * getMBlock(void);
extern void * getMBlocks(nat n);
# define MARK_HEAP_ALLOCED(p) ((MBLOCK_MAP_ENTRY(p) < MBLOCK_MAP_SIZE) \
&& (mblock_map[MBLOCK_MAP_ENTRY(p)] = 1))
-#elif defined(TEXT_BEFORE_HEAP)
-/* Fall back to old method - assume heap above HEAP_BASE */
-# define HEAP_ALLOCED(p) ((StgPtr)(p) >= (StgPtr)(HEAP_BASE))
-# define MARK_HEAP_ALLOCED(p) do {} while(0)
+#elif SIZEOF_VOID_P == 8
+/* XXX: This is a HACK, and will not work in general! We just use the
+ * lower 32 bits of the address, and do the same as for the 32-bit
+ * version. As long as the OS gives us memory in a roughly linear
+ * fashion, it won't go wrong until we've allocated 4G. */
+# define MBLOCK_MAP_SIZE 4096
+# define MBLOCK_MAP_ENTRY(p) (((StgWord)(p) & 0xffffffff) >> MBLOCK_SHIFT)
+# define HEAP_ALLOCED(p) (mblock_map[MBLOCK_MAP_ENTRY(p)])
+# define MARK_HEAP_ALLOCED(p) (mblock_map[MBLOCK_MAP_ENTRY(p)] = 1)
+
#else
# error HEAP_ALLOCED not defined