X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FBlock.h;h=d1705ad68650afddb9451d415d6f3d3db1c9a0b8;hb=28a464a75e14cece5db40f2765a29348273ff2d2;hp=d7599c5931de7a5d17eab0cec867f70e61bbe95e;hpb=423d477bfecd490de1449c59325c8776f91d7aac;p=ghc-hetmet.git diff --git a/ghc/includes/Block.h b/ghc/includes/Block.h index d7599c5..d1705ad 100644 --- a/ghc/includes/Block.h +++ b/ghc/includes/Block.h @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: Block.h,v 1.17 2004/08/13 13:09:09 simonmar Exp $ * * (c) The GHC Team, 1998-1999 * @@ -57,7 +56,7 @@ typedef struct bdescr_ { StgWord *bitmap; } u; unsigned int gen_no; /* generation */ - struct _step *step; /* step */ + struct step_ *step; /* step */ StgWord32 blocks; /* no. of blocks (if grp head, 0 otherwise) */ StgWord32 flags; /* block is in to-space */ #if SIZEOF_VOID_P == 8 @@ -86,6 +85,8 @@ typedef struct bdescr_ { #define BF_PINNED 4 /* Block is part of a compacted generation */ #define BF_COMPACTED 8 +/* Block is free, and on the free list */ +#define BF_FREE 16 /* Finding the block descriptor for a given block -------------------------- */ @@ -142,9 +143,11 @@ INLINE_HEADER bdescr *Bdescr(StgPtr p) (1 + (W_)MBLOCK_ROUND_UP((n-BLOCKS_PER_MBLOCK) * BLOCK_SIZE) / MBLOCK_SIZE) +#ifndef CMINUSMINUS +/* to the end... */ + /* Double-linked block lists: --------------------------------------------- */ -#ifndef CMINUSMINUS INLINE_HEADER void dbl_link_onto(bdescr *bd, bdescr **list) { @@ -155,6 +158,45 @@ dbl_link_onto(bdescr *bd, bdescr **list) } *list = bd; } -#endif +/* Initialisation ---------------------------------------------------------- */ + +extern void initBlockAllocator(void); + +/* Allocation -------------------------------------------------------------- */ + +bdescr *allocGroup(nat n); +bdescr *allocBlock(void); + +// versions that take the storage manager lock for you: +bdescr *allocGroup_lock(nat n); +bdescr *allocBlock_lock(void); + +/* De-Allocation ----------------------------------------------------------- */ + +void freeGroup(bdescr *p); +void freeChain(bdescr *p); + +// versions that take the storage manager lock for you: +void freeGroup_lock(bdescr *p); +void freeChain_lock(bdescr *p); + +/* Round a value to megablocks --------------------------------------------- */ + +#define WORDS_PER_MBLOCK (BLOCKS_PER_MBLOCK * BLOCK_SIZE_W) + +INLINE_HEADER nat +round_to_mblocks(nat words) +{ + 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; +} + +#endif /* !CMINUSMINUS */ #endif /* BLOCK_H */