X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCAux.c;h=12e106b0e0aad6d94b016afdb694e28a39bb693d;hb=d45197aabb22178066a8ec50d29331786a0c518c;hp=825d0f9a3edeb06831c6e571794589aa9dc76461;hpb=4e79709df545c16812b85f2c27ab3411f5a7b54f;p=ghc-hetmet.git diff --git a/rts/sm/GCAux.c b/rts/sm/GCAux.c index 825d0f9..12e106b 100644 --- a/rts/sm/GCAux.c +++ b/rts/sm/GCAux.c @@ -7,16 +7,17 @@ * * ---------------------------------------------------------------------------*/ +#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" #include "Trace.h" #include "Schedule.h" -// DO NOT include "GCThread.h", we don't want the register variable +// DO NOT include "GCTDecl.h", we don't want the register variable /* ----------------------------------------------------------------------------- isAlive determines whether the given closure is still alive (after @@ -44,11 +45,15 @@ isAlive(StgClosure *p) // ignore static closures // + // ToDo: This means we never look through IND_STATIC, which means + // isRetainer needs to handle the IND_STATIC case rather than + // raising an error. + // // ToDo: for static closures, check the static link field. // 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 +67,11 @@ isAlive(StgClosure *p) // large objects use the evacuated flag if (bd->flags & BF_LARGE) { - return NULL; + 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; } @@ -74,7 +79,7 @@ isAlive(StgClosure *p) if (IS_FORWARDING_PTR(info)) { // alive! - return (StgClosure*)UN_FORWARDING_PTR(info); + return TAG_CLOSURE(tag,(StgClosure*)UN_FORWARDING_PTR(info)); } info = INFO_PTR_TO_STRUCT(info); @@ -84,19 +89,10 @@ isAlive(StgClosure *p) case IND: case IND_STATIC: case IND_PERM: - case IND_OLDGEN: // rely on compatible layout with StgInd - case IND_OLDGEN_PERM: // follow indirections p = ((StgInd *)q)->indirectee; continue; - case TSO: - if (((StgTSO *)q)->what_next == ThreadRelocated) { - p = (StgClosure *)((StgTSO *)q)->_link; - continue; - } - return NULL; - default: // dead. return NULL; @@ -113,14 +109,15 @@ revertCAFs( void ) { StgIndStatic *c; - 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) { SET_INFO(c, c->saved_info); 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 +125,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);