X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FBlockAlloc.c;h=681946382122f83763a75d1848c1c9223a5e383d;hb=e5dfcd65b1d6733d9140c0458335f5d0a57a10e4;hp=26f2a60bc509d4b54f4a482b7a659dae4f1af719;hpb=4391e44f910ce579f269986faef9e5db8907a6c0;p=ghc-hetmet.git diff --git a/ghc/rts/BlockAlloc.c b/ghc/rts/BlockAlloc.c index 26f2a60..6819463 100644 --- a/ghc/rts/BlockAlloc.c +++ b/ghc/rts/BlockAlloc.c @@ -1,6 +1,8 @@ /* ----------------------------------------------------------------------------- - * $Id: BlockAlloc.c,v 1.3 1999/01/13 17:25:37 simonm Exp $ + * $Id: BlockAlloc.c,v 1.7 2000/01/30 10:17:44 simonmar Exp $ * + * (c) The GHC Team 1998-2000 + * * The block allocator and free list manager. * * This is the architecture independent part of the block allocator. @@ -71,6 +73,9 @@ allocGroup(nat n) *last = bd->link; /* no initialisation necessary - this is already a * self-contained block group. */ +#ifdef DEBUG + bd->free = bd->start; /* block isn't free now */ +#endif return bd; } if (bd->blocks > n) { /* block too big... */ @@ -86,8 +91,10 @@ allocGroup(nat n) initMBlock(mblock); /* initialise the start fields */ bd = FIRST_BDESCR(mblock); initGroup(n,bd); /* we know the group will fit */ - initGroup(BLOCKS_PER_MBLOCK-n, bd+n); - freeGroup(bd+n); /* add the rest on to the free list */ + if (n < BLOCKS_PER_MBLOCK) { + initGroup(BLOCKS_PER_MBLOCK-n, bd+n); + freeGroup(bd+n); /* add the rest on to the free list */ + } return bd; } @@ -124,7 +131,9 @@ allocMegaGroup(nat n) if (bd->blocks == BLOCKS_PER_MBLOCK) { /* whole megablock found */ - if (grp_start == NULL) { /* is it the first one we've found? */ + /* is it the first one we've found or a non-contiguous megablock? */ + if (grp_start == NULL || + bd->start != last->start + MBLOCK_SIZE/sizeof(W_)) { grp_start = bd; grp_prev = last; mbs_found = 1;