X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCAux.c;h=404e9bbcbcc981697d60221a669148649b0b30fd;hb=d84757e30d8578aaa788c26f0245c67ab482d0f9;hp=df47e187949943c7b86f123463bc1567e9165063;hpb=233a468745d108ea845e0898e4177df2c3734fc0;p=ghc-hetmet.git diff --git a/rts/sm/GCAux.c b/rts/sm/GCAux.c index df47e18..404e9bb 100644 --- a/rts/sm/GCAux.c +++ b/rts/sm/GCAux.c @@ -7,10 +7,11 @@ * * ---------------------------------------------------------------------------*/ +#include "PosixSource.h" #include "Rts.h" -#include "Storage.h" -#include "MBlock.h" + #include "GC.h" +#include "Storage.h" #include "Compact.h" #include "Task.h" #include "Capability.h" @@ -48,7 +49,7 @@ isAlive(StgClosure *p) // Problem here is that we sometimes don't set the link field, eg. // for static closures with an empty SRT or CONSTR_STATIC_NOCAFs. // - if (!HEAP_ALLOCED(q)) { + if (!HEAP_ALLOCED_GC(q)) { return p; } @@ -62,15 +63,28 @@ isAlive(StgClosure *p) // large objects use the evacuated flag if (bd->flags & BF_LARGE) { + if (get_itbl(q)->type == TSO && + ((StgTSO *)p)->what_next == ThreadRelocated) { + p = (StgClosure *)((StgTSO *)p)->_link; + continue; + } return NULL; } // check the mark bit for compacted steps - if ((bd->flags & BF_COMPACTED) && is_marked((P_)q,bd)) { + if ((bd->flags & BF_MARKED) && is_marked((P_)q,bd)) { return p; } - info = get_itbl(q); + info = q->header.info; + + if (IS_FORWARDING_PTR(info)) { + // alive! + return (StgClosure*)UN_FORWARDING_PTR(info); + } + + info = INFO_PTR_TO_STRUCT(info); + switch (info->type) { case IND: @@ -82,10 +96,6 @@ isAlive(StgClosure *p) p = ((StgInd *)q)->indirectee; continue; - case EVACUATED: - // alive! - return ((StgEvacuated *)q)->evacuee; - case TSO: if (((StgTSO *)q)->what_next == ThreadRelocated) { p = (StgClosure *)((StgTSO *)q)->_link;