[project @ 2003-10-01 10:57:39 by wolfgang]
[ghc-hetmet.git] / ghc / rts / BlockAlloc.h
index d3e6d53..504e954 100644 (file)
@@ -1,5 +1,7 @@
 /* -----------------------------------------------------------------------------
- * $Id: BlockAlloc.h,v 1.2 1998/12/02 13:28:13 simonm Exp $
+ * $Id: BlockAlloc.h,v 1.9 2001/05/03 16:32:55 simonmar Exp $
+ *
+ * (c) The GHC Team, 1998-1999
  *
  * Block Allocator Interface
  *
@@ -22,20 +24,28 @@ extern bdescr *allocBlock(void);
 extern void freeGroup(bdescr *p);
 extern void freeChain(bdescr *p);
 
-/* Finding the block descriptor for a given block -------------------------- */
+/* Round a value to megablocks --------------------------------------------- */
+
+#define WORDS_PER_MBLOCK  (BLOCKS_PER_MBLOCK * BLOCK_SIZE_W)
 
-static inline bdescr *Bdescr(StgPtr p)
+static inline nat
+round_to_mblocks(nat words)
 {
-  return (bdescr *)
-    ((((W_)p &  MBLOCK_MASK & ~BLOCK_MASK) >> (BLOCK_SHIFT-BDESCR_SHIFT)) 
-     | ((W_)p & ~MBLOCK_MASK)
-     );
+  if (words > WORDS_PER_MBLOCK) {
+    if ((words % WORDS_PER_MBLOCK) < (WORDS_PER_MBLOCK / 2)) {
+      words = (words / WORDS_PER_MBLOCK) * WORDS_PER_MBLOCK;
+    } else {
+      words = ((words / WORDS_PER_MBLOCK) + 1) * WORDS_PER_MBLOCK;
+    }
+  }
+  return words;
 }
 
 /* Debugging  -------------------------------------------------------------- */
 
 #ifdef DEBUG
 extern void checkFreeListSanity(void);
+nat         countFreeList(void);
 #endif
 
-#endif BLOCK_ALLOC_H
+#endif /* BLOCK_ALLOC_H */