X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=includes%2FBlock.h;h=7721765147b46b3c6b65884ac35db58b7de75c00;hb=b4b8d87643ab42385fb9a36641be0f575b5b9d98;hp=d1705ad68650afddb9451d415d6f3d3db1c9a0b8;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/includes/Block.h b/includes/Block.h index d1705ad..7721765 100644 --- a/includes/Block.h +++ b/includes/Block.h @@ -85,8 +85,10 @@ 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 */ +/* Block is free, and on the free list (TODO: is this used?) */ #define BF_FREE 16 +/* Block is executable */ +#define BF_EXEC 32 /* Finding the block descriptor for a given block -------------------------- */ @@ -128,6 +130,11 @@ INLINE_HEADER bdescr *Bdescr(StgPtr p) #define FIRST_BDESCR(m) \ ((bdescr *)((FIRST_BLOCK_OFF>>(BLOCK_SHIFT-BDESCR_SHIFT)) + (W_)(m))) +/* Last real block descriptor in a megablock */ + +#define LAST_BDESCR(m) \ + ((bdescr *)(((MBLOCK_SIZE-BLOCK_SIZE)>>(BLOCK_SHIFT-BDESCR_SHIFT)) + (W_)(m))) + /* Number of usable blocks in a megablock */ #define BLOCKS_PER_MBLOCK ((MBLOCK_SIZE - FIRST_BLOCK_OFF) / BLOCK_SIZE) @@ -159,6 +166,45 @@ dbl_link_onto(bdescr *bd, bdescr **list) *list = bd; } +INLINE_HEADER void +dbl_link_remove(bdescr *bd, bdescr **list) +{ + if (bd->u.back) { + bd->u.back->link = bd->link; + } else { + *list = bd->link; + } + if (bd->link) { + bd->link->u.back = bd->u.back; + } +} + +INLINE_HEADER void +dbl_link_insert_after(bdescr *bd, bdescr *after) +{ + bd->link = after->link; + bd->u.back = after; + if (after->link) { + after->link->u.back = bd; + } + after->link = bd; +} + +INLINE_HEADER void +dbl_link_replace(bdescr *new, bdescr *old, bdescr **list) +{ + new->link = old->link; + new->u.back = old->u.back; + if (old->link) { + old->link->u.back = new; + } + if (old->u.back) { + old->u.back->link = new; + } else { + *list = new; + } +} + /* Initialisation ---------------------------------------------------------- */ extern void initBlockAllocator(void); @@ -185,8 +231,8 @@ void freeChain_lock(bdescr *p); #define WORDS_PER_MBLOCK (BLOCKS_PER_MBLOCK * BLOCK_SIZE_W) -INLINE_HEADER nat -round_to_mblocks(nat words) +INLINE_HEADER StgWord +round_to_mblocks(StgWord words) { if (words > WORDS_PER_MBLOCK) { if ((words % WORDS_PER_MBLOCK) < (WORDS_PER_MBLOCK / 2)) {