X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCAux.c;h=3962bf0d99e33bf91880f6822902a0dcdb3cd989;hb=1373cd3085b8dec456e6118c58e940718cb9d559;hp=825d0f9a3edeb06831c6e571794589aa9dc76461;hpb=4e79709df545c16812b85f2c27ab3411f5a7b54f;p=ghc-hetmet.git diff --git a/rts/sm/GCAux.c b/rts/sm/GCAux.c index 825d0f9..3962bf0 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,11 +63,16 @@ 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; } @@ -120,7 +126,7 @@ revertCAFs( void ) c->saved_info = NULL; // could, but not necessary: c->static_link = NULL; } - revertible_caf_list = NULL; + revertible_caf_list = END_OF_STATIC_LIST; } void @@ -128,12 +134,14 @@ markCAFs (evac_fn evac, void *user) { StgIndStatic *c; - for (c = (StgIndStatic *)caf_list; c != NULL; + for (c = (StgIndStatic *)caf_list; + c != (StgIndStatic*)END_OF_STATIC_LIST; c = (StgIndStatic *)c->static_link) { evac(user, &c->indirectee); } - for (c = (StgIndStatic *)revertible_caf_list; c != NULL; + for (c = (StgIndStatic *)revertible_caf_list; + c != (StgIndStatic*)END_OF_STATIC_LIST; c = (StgIndStatic *)c->static_link) { evac(user, &c->indirectee);