#include "Stats.h"
#include "Hash.h"
#include "RetainerProfile.h"
+#include "LdvProfile.h"
#include "Arena.h"
#include "Printer.h"
static rtsBool closureSatisfiesConstraints( StgClosure* p );
/* ----------------------------------------------------------------------------
- Closure Type Profiling;
- ------------------------------------------------------------------------- */
-
-#ifndef PROFILING
-static char *type_names[] = {
- "INVALID_OBJECT",
- "CONSTR",
- "CONSTR_1_0",
- "CONSTR_0_1",
- "CONSTR_2_0",
- "CONSTR_1_1",
- "CONSTR_0_2",
- "CONSTR_STATIC",
- "CONSTR_NOCAF_STATIC",
- "FUN",
- "FUN_1_0",
- "FUN_0_1",
- "FUN_2_0",
- "FUN_1_1",
- "FUN_0_2",
- "FUN_STATIC",
- "THUNK",
- "THUNK_1_0",
- "THUNK_0_1",
- "THUNK_2_0",
- "THUNK_1_1",
- "THUNK_0_2",
- "THUNK_STATIC",
- "THUNK_SELECTOR",
- "BCO",
- "AP",
- "PAP",
- "AP_STACK",
- "IND",
- "IND_OLDGEN",
- "IND_PERM",
- "IND_OLDGEN_PERM",
- "IND_STATIC",
- "RET_BCO",
- "RET_SMALL",
- "RET_BIG",
- "RET_DYN",
- "RET_FUN",
- "UPDATE_FRAME",
- "CATCH_FRAME",
- "STOP_FRAME",
- "CAF_BLACKHOLE",
- "BLACKHOLE",
- "MVAR_CLEAN",
- "MVAR_DIRTY",
- "ARR_WORDS",
- "MUT_ARR_PTRS_CLEAN",
- "MUT_ARR_PTRS_DIRTY",
- "MUT_ARR_PTRS_FROZEN0",
- "MUT_ARR_PTRS_FROZEN",
- "MUT_VAR_CLEAN",
- "MUT_VAR_DIRTY",
- "WEAK",
- "STABLE_NAME",
- "TSO",
- "BLOCKED_FETCH",
- "FETCH_ME",
- "FETCH_ME_BQ",
- "RBH",
- "REMOTE_REF",
- "TVAR_WATCH_QUEUE",
- "INVARIANT_CHECK_QUEUE",
- "ATOMIC_INVARIANT",
- "TVAR",
- "TREC_CHUNK",
- "TREC_HEADER",
- "ATOMICALLY_FRAME",
- "CATCH_RETRY_FRAME",
- "CATCH_STM_FRAME",
- "WHITEHOLE",
- "N_CLOSURE_TYPES"
- };
-#endif
-
-/* ----------------------------------------------------------------------------
* Find the "closure identity", which is a unique pointer reresenting
* the band to which this closure's heap space is attributed in the
* heap profile.
case CONSTR_NOCAF_STATIC:
return GET_CON_DESC(itbl_to_con_itbl(info));
default:
- return type_names[info->type];
+ return closure_type_names[info->type];
}
}
case CONSTR:
case FUN:
case IND_PERM:
- case IND_OLDGEN:
- case IND_OLDGEN_PERM:
- case CAF_BLACKHOLE:
case BLACKHOLE:
+ case BLOCKING_QUEUE:
case FUN_1_0:
case FUN_0_1:
case FUN_1_1:
case MVAR_CLEAN:
case MVAR_DIRTY:
case WEAK:
- case STABLE_NAME:
+ case PRIM:
+ case MUT_PRIM:
case MUT_VAR_CLEAN:
case MUT_VAR_DIRTY:
prim = rtsTrue;
break;
#endif
- case TREC_HEADER:
- prim = rtsTrue;
- size = sizeofW(StgTRecHeader);
- break;
-
- case TVAR_WATCH_QUEUE:
- prim = rtsTrue;
- size = sizeofW(StgTVarWatchQueue);
- break;
-
- case INVARIANT_CHECK_QUEUE:
- prim = rtsTrue;
- size = sizeofW(StgInvariantCheckQueue);
- break;
-
- case ATOMIC_INVARIANT:
- prim = rtsTrue;
- size = sizeofW(StgAtomicInvariant);
- break;
-
- case TVAR:
- prim = rtsTrue;
- size = sizeofW(StgTVar);
- break;
-
case TREC_CHUNK:
prim = rtsTrue;
size = sizeofW(StgTRecChunk);
void
heapCensus( void )
{
- nat g, s;
+ nat g;
Census *census;
census = &censuses[era];
#endif
// Traverse the heap, collecting the census info
- if (RtsFlags.GcFlags.generations == 1) {
- heapCensusChain( census, g0s0->blocks );
- } else {
- for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
- for (s = 0; s < generations[g].n_steps; s++) {
- heapCensusChain( census, generations[g].steps[s].blocks );
- // Are we interested in large objects? might be
- // confusing to include the stack in a heap profile.
- heapCensusChain( census, generations[g].steps[s].large_objects );
- }
- }
+ for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
+ heapCensusChain( census, generations[g].blocks );
+ // Are we interested in large objects? might be
+ // confusing to include the stack in a heap profile.
+ heapCensusChain( census, generations[g].large_objects );
}
// dump out the census info