X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FProfHeap.c;h=599b479c8dcf0454623658b4fcc8c6e2d0e06169;hp=dfa00677fdd4849a753f0fed9158f3058aa67b7c;hb=842e9d6628a27cf1f420d53f6a5901935dc50c54;hpb=cbeb99efd4a117de5b028341dc41bc8f50717383 diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c index dfa0067..599b479 100644 --- a/rts/ProfHeap.c +++ b/rts/ProfHeap.c @@ -99,6 +99,7 @@ static void dumpCensus( Census *census ); Closure Type Profiling; ------------------------------------------------------------------------- */ +#ifndef PROFILING static char *type_names[] = { "INVALID_OBJECT", "CONSTR", @@ -145,7 +146,8 @@ static char *type_names[] = { "BLACKHOLE", "SE_BLACKHOLE", "SE_CAF_BLACKHOLE", - "MVAR", + "MVAR_CLEAN", + "MVAR_DIRTY", "ARR_WORDS", "MUT_ARR_PTRS_CLEAN", "MUT_ARR_PTRS_DIRTY", @@ -173,6 +175,7 @@ static char *type_names[] = { "CATCH_STM_FRAME", "N_CLOSURE_TYPES" }; +#endif /* ---------------------------------------------------------------------------- * Find the "closure identity", which is a unique pointer reresenting @@ -190,9 +193,9 @@ closureIdentity( StgClosure *p ) case HEAP_BY_MOD: return p->header.prof.ccs->cc->module; case HEAP_BY_DESCR: - return get_itbl(p)->prof.closure_desc; + return GET_PROF_DESC(get_itbl(p)); case HEAP_BY_TYPE: - return get_itbl(p)->prof.closure_type; + return GET_PROF_TYPE(get_itbl(p)); case HEAP_BY_RETAINER: // AFAIK, the only closures in the heap which might not have a // valid retainer set are DEAD_WEAK closures. @@ -215,7 +218,6 @@ closureIdentity( StgClosure *p ) case CONSTR_0_2: case CONSTR_STATIC: case CONSTR_NOCAF_STATIC: - printf("",strlen(GET_CON_DESC(itbl_to_con_itbl(info)))); return GET_CON_DESC(itbl_to_con_itbl(info)); default: return type_names[info->type]; @@ -341,8 +343,12 @@ initEra(Census *census) STATIC_INLINE void freeEra(Census *census) { - arenaFree(census->arena); - freeHashTable(census->hash, NULL); + if (RtsFlags.ProfFlags.bioSelector != NULL) + // when bioSelector==NULL, these are freed in heapCensus() + { + arenaFree(census->arena); + freeHashTable(census->hash, NULL); + } } /* -------------------------------------------------------------------------- @@ -377,7 +383,7 @@ nextEra( void ) * Heap profiling by info table * ------------------------------------------------------------------------- */ -#if !defined(PROFILNG) +#if !defined(PROFILING) FILE *hp_file; static char *hp_filename; @@ -452,12 +458,8 @@ initHeapProfiling(void) era = 0; } - { // max_era = 2^LDV_SHIFT - nat p; - max_era = 1; - for (p = 0; p < LDV_SHIFT; p++) - max_era *= 2; - } + // max_era = 2^LDV_SHIFT + max_era = 1 << LDV_SHIFT; n_censuses = 32; censuses = stgMallocBytes(sizeof(Census) * n_censuses, "initHeapProfiling"); @@ -523,12 +525,19 @@ endHeapProfiling(void) } #endif - { +#ifdef PROFILING + if (doingLDVProfiling()) { nat t; - for (t = 0; t <= era; t++) { + for (t = 1; t <= era; t++) { freeEra( &censuses[t] ); } + } else { + freeEra( &censuses[0] ); } +#else + freeEra( &censuses[0] ); +#endif + stgFree(censuses); seconds = mut_user_time(); @@ -638,12 +647,12 @@ closureSatisfiesConstraints( StgClosure* p ) } if (RtsFlags.ProfFlags.descrSelector) { - b = strMatchesSelector( (get_itbl((StgClosure *)p))->prof.closure_desc, + b = strMatchesSelector( (GET_PROF_DESC(get_itbl((StgClosure *)p))), RtsFlags.ProfFlags.descrSelector ); if (!b) return rtsFalse; } if (RtsFlags.ProfFlags.typeSelector) { - b = strMatchesSelector( (get_itbl((StgClosure *)p))->prof.closure_type, + b = strMatchesSelector( (GET_PROF_TYPE(get_itbl((StgClosure *)p))), RtsFlags.ProfFlags.typeSelector ); if (!b) return rtsFalse; } @@ -966,7 +975,8 @@ heapCensusChain( Census *census, bdescr *bd ) size = bco_sizeW((StgBCO *)p); break; - case MVAR: + case MVAR_CLEAN: + case MVAR_DIRTY: case WEAK: case STABLE_NAME: case MUT_VAR_CLEAN: @@ -1141,13 +1151,6 @@ heapCensus( void ) #endif // Traverse the heap, collecting the census info - - // First the small_alloc_list: we have to fix the free pointer at - // the end by calling tidyAllocatedLists() first. - tidyAllocateLists(); - heapCensusChain( census, small_alloc_list ); - - // Now traverse the heap in each generation/step. if (RtsFlags.GcFlags.generations == 1) { heapCensusChain( census, g0s0->blocks ); } else {