X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLdvProfile.c;h=0cd80dee6504b5cf0924f765b1f3eaf31885ca83;hb=27de38efce6d73d2a0209f803cfa98c82773e773;hp=19ebe426d30f43e2eed62437b95cb4c5ecda57e4;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/rts/LdvProfile.c b/rts/LdvProfile.c index 19ebe42..0cd80de 100644 --- a/rts/LdvProfile.c +++ b/rts/LdvProfile.c @@ -14,7 +14,6 @@ #include "RtsFlags.h" #include "Profiling.h" #include "Stats.h" -#include "Storage.h" #include "RtsUtils.h" #include "Schedule.h" @@ -69,26 +68,27 @@ STATIC_INLINE nat processHeapClosureForDead( StgClosure *c ) { nat size; - StgInfoTable *info; + const StgInfoTable *info; info = get_itbl(c); - if (info->type != EVACUATED) { - ASSERT(((LDVW(c) & LDV_CREATE_MASK) >> LDV_SHIFT) <= era && - ((LDVW(c) & LDV_CREATE_MASK) >> LDV_SHIFT) > 0); - ASSERT(((LDVW(c) & LDV_STATE_MASK) == LDV_STATE_CREATE) || - ( - (LDVW(c) & LDV_LAST_MASK) <= era && - (LDVW(c) & LDV_LAST_MASK) > 0 - )); - } - - if (info->type == EVACUATED) { + info = c->header.info; + if (IS_FORWARDING_PTR(info)) { // The size of the evacuated closure is currently stored in // the LDV field. See SET_EVACUAEE_FOR_LDV() in // includes/StgLdvProf.h. return LDVW(c); } + info = INFO_PTR_TO_STRUCT(info); + + ASSERT(((LDVW(c) & LDV_CREATE_MASK) >> LDV_SHIFT) <= era && + ((LDVW(c) & LDV_CREATE_MASK) >> LDV_SHIFT) > 0); + ASSERT(((LDVW(c) & LDV_STATE_MASK) == LDV_STATE_CREATE) || + ( + (LDVW(c) & LDV_LAST_MASK) <= era && + (LDVW(c) & LDV_LAST_MASK) > 0 + )); + size = closure_sizeW(c); @@ -97,7 +97,8 @@ processHeapClosureForDead( StgClosure *c ) 'inherently used' cases: do nothing. */ case TSO: - case MVAR: + case MVAR_CLEAN: + case MVAR_DIRTY: case MUT_ARR_PTRS_CLEAN: case MUT_ARR_PTRS_DIRTY: case MUT_ARR_PTRS_FROZEN: @@ -108,10 +109,12 @@ processHeapClosureForDead( StgClosure *c ) case MUT_VAR_DIRTY: case BCO: case STABLE_NAME: - case TVAR_WAIT_QUEUE: + case TVAR_WATCH_QUEUE: case TVAR: case TREC_HEADER: case TREC_CHUNK: + case INVARIANT_CHECK_QUEUE: + case ATOMIC_INVARIANT: return size; /* @@ -168,8 +171,6 @@ processHeapClosureForDead( StgClosure *c ) case CONSTR_STATIC: case FUN_STATIC: case THUNK_STATIC: - case CONSTR_INTLIKE: - case CONSTR_CHARLIKE: case CONSTR_NOCAF_STATIC: // stack objects case UPDATE_FRAME: @@ -178,9 +179,7 @@ processHeapClosureForDead( StgClosure *c ) case RET_DYN: case RET_BCO: case RET_SMALL: - case RET_VEC_SMALL: case RET_BIG: - case RET_VEC_BIG: // others case BLOCKED_FETCH: case FETCH_ME: @@ -249,22 +248,7 @@ processSmallObjectPoolForDead( void ) bdescr *bd; StgPtr p; - bd = small_alloc_list; - - // first block - if (bd == NULL) - return; - - p = bd->start; - while (p < alloc_Hp) { - p += processHeapClosureForDead((StgClosure *)p); - while (p < alloc_Hp && !*p) // skip slop - p++; - } - ASSERT(p == alloc_Hp); - - bd = bd->link; - while (bd != NULL) { + for (bd = g0s0->blocks; bd != NULL; bd = bd->link) { p = bd->start; while (p < bd->free) { p += processHeapClosureForDead((StgClosure *)p); @@ -272,7 +256,6 @@ processSmallObjectPoolForDead( void ) p++; } ASSERT(p == bd->free); - bd = bd->link; } }