X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FStorage.c;h=0bc15c075e6d8732843163acd84bcdb1504dcd1c;hb=1231d33279f25e931bcac1bac046b0f839290d61;hp=ecd9b54358d8298588a08bff17ea65789636a67b;hpb=2cf1115cd06678e5255c39e9fd56787031c31c06;p=ghc-hetmet.git diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c index ecd9b54..0bc15c0 100644 --- a/rts/sm/Storage.c +++ b/rts/sm/Storage.c @@ -956,6 +956,8 @@ countOccupied(bdescr *bd) return words; } +// Return an accurate count of the live data in the heap, excluding +// generation 0. lnat calcLiveWords(void) { @@ -970,9 +972,6 @@ calcLiveWords(void) live = 0; for (g = 0; g < RtsFlags.GcFlags.generations; g++) { for (s = 0; s < generations[g].n_steps; s++) { - /* approximate amount of live data (doesn't take into account slop - * at end of each block). - */ if (g == 0 && s == 0) continue; stp = &generations[g].steps[s]; live += countOccupied(stp->blocks) + @@ -1004,9 +1003,9 @@ calcNeeded(void) generations[g].steps[0].n_large_blocks > generations[g].max_blocks && stp->is_compacted == 0) { - needed += 2 * stp->n_blocks; + needed += 2 * stp->n_blocks + stp->n_large_blocks; } else { - needed += stp->n_blocks; + needed += stp->n_blocks + stp->n_large_blocks; } } } @@ -1118,6 +1117,21 @@ void freeExec (void *addr) #ifdef DEBUG +// Useful for finding partially full blocks in gdb +void findSlop(bdescr *bd); +void findSlop(bdescr *bd) +{ + lnat slop; + + for (; bd != NULL; bd = bd->link) { + slop = (bd->blocks * BLOCK_SIZE_W) - (bd->free - bd->start); + if (slop > (1024/sizeof(W_))) { + debugBelch("block at %p (bdescr %p) has %ldKB slop\n", + bd->start, bd, slop / (1024/sizeof(W_))); + } + } +} + nat countBlocks(bdescr *bd) {