X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FBlockAlloc.h;h=504e954c9876f6c7cd63affe165b2129178ef825;hb=8a45d6bb5426552fc6993fc4a1f391d0f3c77b8d;hp=d3e6d53a34694774f038ddd26218c9e1dd012996;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/rts/BlockAlloc.h b/ghc/rts/BlockAlloc.h index d3e6d53..504e954 100644 --- a/ghc/rts/BlockAlloc.h +++ b/ghc/rts/BlockAlloc.h @@ -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 */