X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCAux.c;h=12e106b0e0aad6d94b016afdb694e28a39bb693d;hb=6cec61d14a324285dbb8ce73d4c7215f1f8d6766;hp=cbbb8b636fe1152c919536b242c7b46963d8f46f;hpb=70a2431f90fa932733ce015714ef7848640ed48f;p=ghc-hetmet.git diff --git a/rts/sm/GCAux.c b/rts/sm/GCAux.c index cbbb8b6..12e106b 100644 --- a/rts/sm/GCAux.c +++ b/rts/sm/GCAux.c @@ -17,7 +17,7 @@ #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 @@ -45,6 +45,10 @@ 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. @@ -63,12 +67,7 @@ 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; + return NULL; } // check the mark bit for compacted steps @@ -80,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); @@ -94,13 +93,6 @@ isAlive(StgClosure *p) 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;