X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FProfHeap.c;h=a50f2f0ac76f2ad3c507f969ab48ccd4ca494cc7;hb=45252b35151fc55aa19fb6770df5ed8267639083;hp=f30ef5d391ddb102def89f17bfde19fbdd6619f5;hpb=178c14217eddba162b9d90579580da6bf9e20fe9;p=ghc-hetmet.git diff --git a/ghc/rts/ProfHeap.c b/ghc/rts/ProfHeap.c index f30ef5d..a50f2f0 100644 --- a/ghc/rts/ProfHeap.c +++ b/ghc/rts/ProfHeap.c @@ -23,7 +23,6 @@ #include "ProfHeap.h" #include "Stats.h" #include "Hash.h" -#include "StrHash.h" #include "RetainerProfile.h" #include "LdvProfile.h" #include "Arena.h" @@ -154,12 +153,13 @@ static char *type_names[] = { , "ARR_WORDS" - , "MUT_ARR_PTRS" + , "MUT_ARR_PTRS_CLEAN" + , "MUT_ARR_PTRS_DIRTY" , "MUT_ARR_PTRS_FROZEN" - , "MUT_VAR" + , "MUT_VAR_CLEAN" + , "MUT_VAR_DIRTY" , "WEAK" - , "FOREIGN" , "TSO" @@ -389,7 +389,7 @@ printSample(rtsBool beginSample, StgDouble sampleValue) fractionalPart = modf(sampleValue, &integralPart); fprintf(hp_file, "%s %d.%02d\n", (beginSample ? "BEGIN_SAMPLE" : "END_SAMPLE"), - (int)integralPart, (int)(fractionalPart * 100 + 0.5)); + (int)integralPart, (int)(fractionalPart * 100)); } /* -------------------------------------------------------------------------- @@ -405,7 +405,7 @@ initHeapProfiling(void) #ifdef PROFILING if (doingLDVProfiling() && doingRetainerProfiling()) { errorBelch("cannot mix -hb and -hr"); - stg_exit(1); + stg_exit(EXIT_FAILURE); } #endif @@ -520,8 +520,6 @@ static void fprint_ccs(FILE *fp, CostCentreStack *ccs, nat max_length) { char buf[max_length+1], *p, *buf_end; - nat next_offset = 0; - nat written; // MAIN on its own gets printed as "MAIN", otherwise we ignore MAIN. if (ccs == CCS_MAIN) { @@ -553,8 +551,6 @@ fprint_ccs(FILE *fp, CostCentreStack *ccs, nat max_length) if (p >= buf_end) { sprintf(buf+max_length-4, "..."); break; - } else { - next_offset += written; } } fprintf(fp, "%s", buf); @@ -874,13 +870,13 @@ heapCensusChain( Census *census, bdescr *bd ) case THUNK_1_1: case THUNK_0_2: case THUNK_2_0: - size = sizeofW(StgHeader) + stg_max(MIN_UPD_SIZE,2); + size = sizeofW(StgThunkHeader) + 2; break; case THUNK_1_0: case THUNK_0_1: case THUNK_SELECTOR: - size = sizeofW(StgHeader) + stg_max(MIN_UPD_SIZE,1); + size = sizeofW(StgThunkHeader) + 1; break; case CONSTR: @@ -906,7 +902,18 @@ heapCensusChain( Census *census, bdescr *bd ) case CONSTR_2_0: size = sizeW_fromITBL(info); break; - + + case IND: + // Special case/Delicate Hack: INDs don't normally + // appear, since we're doing this heap census right + // after GC. However, GarbageCollect() also does + // resurrectThreads(), which can update some + // blackholes when it calls raiseAsync() on the + // resurrected threads. So we know that any IND will + // be the size of a BLACKHOLE. + size = BLACKHOLE_sizeW(); + break; + case BCO: prim = rtsTrue; size = bco_sizeW((StgBCO *)p); @@ -914,9 +921,9 @@ heapCensusChain( Census *census, bdescr *bd ) case MVAR: case WEAK: - case FOREIGN: case STABLE_NAME: - case MUT_VAR: + case MUT_VAR_CLEAN: + case MUT_VAR_DIRTY: prim = rtsTrue; size = sizeW_fromITBL(info); break; @@ -938,8 +945,10 @@ heapCensusChain( Census *census, bdescr *bd ) size = arr_words_sizeW(stgCast(StgArrWords*,p)); break; - case MUT_ARR_PTRS: + case MUT_ARR_PTRS_CLEAN: + case MUT_ARR_PTRS_DIRTY: case MUT_ARR_PTRS_FROZEN: + case MUT_ARR_PTRS_FROZEN0: prim = rtsTrue; size = mut_arr_ptrs_sizeW((StgMutArrPtrs *)p); break; @@ -960,8 +969,28 @@ heapCensusChain( Census *census, bdescr *bd ) } #endif + case TREC_HEADER: + prim = rtsTrue; + size = sizeofW(StgTRecHeader); + break; + + case TVAR_WAIT_QUEUE: + prim = rtsTrue; + size = sizeofW(StgTVarWaitQueue); + break; + + case TVAR: + prim = rtsTrue; + size = sizeofW(StgTVar); + break; + + case TREC_CHUNK: + prim = rtsTrue; + size = sizeofW(StgTRecChunk); + break; + default: - barf("heapCensus"); + barf("heapCensus, unknown object: %d", info->type); } identity = NULL; @@ -1063,7 +1092,7 @@ heapCensus( void ) // Now traverse the heap in each generation/step. if (RtsFlags.GcFlags.generations == 1) { - heapCensusChain( census, g0s0->to_blocks ); + heapCensusChain( census, g0s0->blocks ); } else { for (g = 0; g < RtsFlags.GcFlags.generations; g++) { for (s = 0; s < generations[g].n_steps; s++) {