diff options
author | Simon Marlow <marlowsd@gmail.com> | 2010-12-09 16:39:19 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2010-12-09 16:39:19 +0000 |
commit | 2b091a6c5352ef2e745e879920f48f27567ec1e8 (patch) | |
tree | 4ff89e8eb39f5bdf1b631634588fc5432e8cbc1f | |
parent | 03edcb58482b016a8ee019a06e114c8e8c996400 (diff) | |
download | haskell-2b091a6c5352ef2e745e879920f48f27567ec1e8.tar.gz |
fix another sanity error, and refactor/tidy up
-rw-r--r-- | rts/sm/BlockAlloc.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/rts/sm/BlockAlloc.c b/rts/sm/BlockAlloc.c index 429ebd03ad..75c88326ad 100644 --- a/rts/sm/BlockAlloc.c +++ b/rts/sm/BlockAlloc.c @@ -332,10 +332,7 @@ allocGroup (nat n) bd = alloc_mega_group(mblocks); // only the bdescrs of the first MB are required to be initialised initGroup(bd); - - IF_DEBUG(sanity,memset(bd->start, 0xaa, bd->blocks * BLOCK_SIZE)); - IF_DEBUG(sanity, checkFreeListSanity()); - return bd; + goto finish; } n_alloc_blocks += n; @@ -364,8 +361,7 @@ allocGroup (nat n) initGroup(rem); // init the slop n_alloc_blocks += rem->blocks; freeGroup(rem); // add the slop on to the free list - IF_DEBUG(sanity, checkFreeListSanity()); - return bd; + goto finish; } bd = free_list[ln]; @@ -373,19 +369,22 @@ allocGroup (nat n) if (bd->blocks == n) // exactly the right size! { dbl_link_remove(bd, &free_list[ln]); + initGroup(bd); } else if (bd->blocks > n) // block too big... { bd = split_free_block(bd, n, ln); + ASSERT(bd->blocks == n); + initGroup(bd); } else { barf("allocGroup: free list corrupted"); } - initGroup(bd); // initialise it - IF_DEBUG(sanity,memset(bd->start, 0xaa, bd->blocks * BLOCK_SIZE)); + +finish: + IF_DEBUG(sanity, memset(bd->start, 0xaa, bd->blocks * BLOCK_SIZE)); IF_DEBUG(sanity, checkFreeListSanity()); - ASSERT(bd->blocks == n); return bd; } |