in rts/ProfHeap.c [891:966]
static void heapProfObject(Census *census, StgClosure *p, size_t size,
bool prim
#if !defined(PROFILING)
STG_UNUSED
#endif
)
{
const void *identity;
size_t real_size;
counter *ctr;
identity = NULL;
#if defined(PROFILING)
// subtract the profiling overhead
real_size = size - sizeofW(StgProfHeader);
#else
real_size = size;
#endif
if (closureSatisfiesConstraints((StgClosure*)p)) {
#if defined(PROFILING)
if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_LDV) {
if (prim)
census->prim += real_size;
else if ((LDVW(p) & LDV_STATE_MASK) == LDV_STATE_CREATE)
census->not_used += real_size;
else
census->used += real_size;
} else
#endif
{
identity = closureIdentity((StgClosure *)p);
if (identity != NULL) {
ctr = lookupHashTable(census->hash, (StgWord)identity);
if (ctr != NULL) {
#if defined(PROFILING)
if (RtsFlags.ProfFlags.bioSelector != NULL) {
if (prim)
ctr->c.ldv.prim += real_size;
else if ((LDVW(p) & LDV_STATE_MASK) == LDV_STATE_CREATE)
ctr->c.ldv.not_used += real_size;
else
ctr->c.ldv.used += real_size;
} else
#endif
{
ctr->c.resid += real_size;
}
} else {
ctr = arenaAlloc( census->arena, sizeof(counter) );
initLDVCtr(ctr);
insertHashTable( census->hash, (StgWord)identity, ctr );
ctr->identity = identity;
ctr->next = census->ctrs;
census->ctrs = ctr;
#if defined(PROFILING)
if (RtsFlags.ProfFlags.bioSelector != NULL) {
if (prim)
ctr->c.ldv.prim = real_size;
else if ((LDVW(p) & LDV_STATE_MASK) == LDV_STATE_CREATE)
ctr->c.ldv.not_used = real_size;
else
ctr->c.ldv.used = real_size;
} else
#endif
{
ctr->c.resid = real_size;
}
}
}
}
}
}