X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fsm%2FGCAux.c;h=97af17a02cb43f8726046c57574658224b82429f;hb=163d12852002a67c5b661b4b3e7e3c5bb6faa5f3;hp=3962bf0d99e33bf91880f6822902a0dcdb3cd989;hpb=1373cd3085b8dec456e6118c58e940718cb9d559;p=ghc-hetmet.git diff --git a/rts/sm/GCAux.c b/rts/sm/GCAux.c index 3962bf0..97af17a 100644 --- a/rts/sm/GCAux.c +++ b/rts/sm/GCAux.c @@ -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 @@ -90,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; @@ -119,7 +109,8 @@ 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);