X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FCompact.c;h=feebef87aa79b6d98cfcf4abded3cba97b3ed333;hb=60a049fa75ec3b4a1d348c235a1fc399739165c0;hp=ef0aefc28ed5114b28bbdcb7145e20e2a048bf60;hpb=cb3cb473854e815784375ad23cc5081621a95ce8;p=ghc-hetmet.git diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c index ef0aefc..feebef8 100644 --- a/rts/sm/Compact.c +++ b/rts/sm/Compact.c @@ -1,9 +1,14 @@ /* ----------------------------------------------------------------------------- * - * (c) The GHC Team 2001 + * (c) The GHC Team 2001-2006 * * Compacting garbage collector * + * Documentation on the architecture of the Garbage Collector can be + * found in the online commentary: + * + * http://hackage.haskell.org/trac/ghc/wiki/Commentary/Rts/Storage/GC + * * ---------------------------------------------------------------------------*/ #include "PosixSource.h" @@ -11,8 +16,6 @@ #include "RtsUtils.h" #include "RtsFlags.h" #include "OSThreads.h" -#include "Storage.h" -#include "Stable.h" #include "BlockAlloc.h" #include "MBlock.h" #include "GC.h" @@ -263,7 +266,6 @@ thread_stack(StgPtr p, StgPtr stack_end) case STOP_FRAME: case CATCH_FRAME: case RET_SMALL: - case RET_VEC_SMALL: bitmap = BITMAP_BITS(info->i.layout.bitmap); size = BITMAP_SIZE(info->i.layout.bitmap); p++; @@ -295,7 +297,6 @@ thread_stack(StgPtr p, StgPtr stack_end) // large bitmap (> 32 entries, or 64 on a 64-bit machine) case RET_BIG: - case RET_VEC_BIG: p++; size = GET_LARGE_BITMAP(&info->i)->size; thread_large_bitmap(p, GET_LARGE_BITMAP(&info->i), size); @@ -527,7 +528,6 @@ thread_obj (StgInfoTable *info, StgPtr p) thread_(&bco->instrs); thread_(&bco->literals); thread_(&bco->ptrs); - thread_(&bco->itbls); return p + bco_sizeW(bco); } @@ -763,6 +763,10 @@ update_fwd_compact( bdescr *blocks ) // know the destination without the size, because we may // spill into the next block. So we have to run down the // threaded list and get the info ptr first. + // + // ToDo: one possible avenue of attack is to use the fact + // that if (p&BLOCK_MASK) >= (free&BLOCK_MASK), then we + // definitely have enough room. Also see bug #1147. info = get_threaded_info(p); q = p;