X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FProfHeap.c;h=932c0694233b4e37247476fcc69a5a4e6f6928c8;hb=593d142d840df09f64b2e8a24f19a298122e27a3;hp=837591bf46e6a28b5dfb6de9389befd6dee31346;hpb=20593d1d1cf47050d9430895a1c2ada6c39dfb98;p=ghc-hetmet.git diff --git a/ghc/rts/ProfHeap.c b/ghc/rts/ProfHeap.c index 837591b..932c069 100644 --- a/ghc/rts/ProfHeap.c +++ b/ghc/rts/ProfHeap.c @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: ProfHeap.c,v 1.50 2003/11/12 17:49:08 sof Exp $ * * (c) The GHC Team, 1998-2003 * @@ -32,6 +31,7 @@ #include #include +#include /* ----------------------------------------------------------------------------- * era stores the current time period. It is the same as the @@ -46,7 +46,7 @@ * When era reaches max_era, the profiling stops because a closure can * store only up to (max_era - 1) as its creation or last use time. * -------------------------------------------------------------------------- */ -nat era; +unsigned int era; static nat max_era; /* ----------------------------------------------------------------------------- @@ -249,6 +249,7 @@ LDV_recordDead( StgClosure *c, nat size ) if (era > 0 && closureSatisfiesConstraints(c)) { size -= sizeofW(StgProfHeader); + ASSERT(LDVW(c) != 0); if ((LDVW((c)) & LDV_STATE_MASK) == LDV_STATE_CREATE) { t = (LDVW((c)) & LDV_CREATE_MASK) >> LDV_SHIFT; if (t < era) { @@ -330,7 +331,7 @@ nextEra( void ) era++; if (era == max_era) { - prog_belch("maximum number of censuses reached; use +RTS -i to reduce"); + errorBelch("maximum number of censuses reached; use +RTS -i to reduce"); stg_exit(EXIT_FAILURE); } @@ -366,7 +367,7 @@ void initProfiling2( void ) /* open the log file */ if ((hp_file = fopen(hp_filename, "w")) == NULL) { - fprintf(stderr, "Can't open profiling report file %s\n", + debugBelch("Can't open profiling report file %s\n", hp_filename); RtsFlags.ProfFlags.doHeapProfile = 0; return; @@ -382,6 +383,16 @@ void endProfiling( void ) } #endif /* DEBUG_HEAP_PROF */ +static void +printSample(rtsBool beginSample, StgDouble sampleValue) +{ + StgDouble fractionalPart, integralPart; + fractionalPart = modf(sampleValue, &integralPart); + fprintf(hp_file, "%s %d.%02d\n", + (beginSample ? "BEGIN_SAMPLE" : "END_SAMPLE"), + (int)integralPart, (int)(fractionalPart * 100 + 0.5)); +} + /* -------------------------------------------------------------------------- * Initialize the heap profilier * ----------------------------------------------------------------------- */ @@ -394,7 +405,7 @@ initHeapProfiling(void) #ifdef PROFILING if (doingLDVProfiling() && doingRetainerProfiling()) { - prog_belch("cannot mix -hb and -hr"); + errorBelch("cannot mix -hb and -hr"); stg_exit(1); } #endif @@ -430,10 +441,9 @@ initHeapProfiling(void) int count; for(count = 1; count < prog_argc; count++) fprintf(hp_file, " %s", prog_argv[count]); - fprintf(hp_file, " +RTS "); + fprintf(hp_file, " +RTS"); for(count = 0; count < rts_argc; count++) - fprintf(hp_file, "%s ", rts_argv[count]); - fprintf(hp_file, "\n"); + fprintf(hp_file, " %s", rts_argv[count]); } #endif /* PROFILING */ @@ -444,8 +454,8 @@ initHeapProfiling(void) fprintf(hp_file, "SAMPLE_UNIT \"seconds\"\n"); fprintf(hp_file, "VALUE_UNIT \"bytes\"\n"); - fprintf(hp_file, "BEGIN_SAMPLE 0.00\n"); - fprintf(hp_file, "END_SAMPLE 0.00\n"); + printSample(rtsTrue, 0); + printSample(rtsFalse, 0); #ifdef DEBUG_HEAP_PROF DEBUG_LoadSymbols(prog_name); @@ -487,8 +497,8 @@ endHeapProfiling(void) #endif seconds = mut_user_time(); - fprintf(hp_file, "BEGIN_SAMPLE %0.2f\n", seconds); - fprintf(hp_file, "END_SAMPLE %0.2f\n", seconds); + printSample(rtsTrue, seconds); + printSample(rtsFalse, seconds); fclose(hp_file); } @@ -556,7 +566,7 @@ rtsBool strMatchesSelector( char* str, char* sel ) { char* p; - // fprintf(stderr, "str_matches_selector %s %s\n", str, sel); + // debugBelch("str_matches_selector %s %s\n", str, sel); while (1) { // Compare str against wherever we've got to in sel. p = str; @@ -584,6 +594,7 @@ rtsBool closureSatisfiesConstraints( StgClosure* p ) { #ifdef DEBUG_HEAP_PROF + (void)p; /* keep gcc -Wall happy */ return rtsTrue; #else rtsBool b; @@ -684,8 +695,8 @@ aggregateCensusInfo( void ) // totals *must* be zero. ASSERT(c->c.ldv.void_total == 0 && c->c.ldv.drag_total == 0); - // fprintCCS(stderr,c->identity); - // fprintf(stderr," census=%d void_total=%d drag_total=%d\n", + // debugCCS(c->identity); + // debugBelch(" census=%d void_total=%d drag_total=%d\n", // t, c->c.ldv.void_total, c->c.ldv.drag_total); } else { d->c.ldv.void_total += c->c.ldv.void_total; @@ -730,7 +741,7 @@ dumpCensus( Census *census ) counter *ctr; int count; - fprintf(hp_file, "BEGIN_SAMPLE %0.2f\n", census->time); + printSample(rtsTrue, census->time); #ifdef PROFILING if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_LDV) { @@ -743,7 +754,7 @@ dumpCensus( Census *census ) census->prim * sizeof(W_)); fprintf(hp_file, "DRAG\t%u\n", census->drag_total * sizeof(W_)); - fprintf(hp_file, "END_SAMPLE %0.2f\n", census->time); + printSample(rtsFalse, census->time); return; } #endif @@ -823,7 +834,7 @@ dumpCensus( Census *census ) fprintf(hp_file, "\t%d\n", count * sizeof(W_)); } - fprintf(hp_file, "END_SAMPLE %0.2f\n", census->time); + printSample(rtsFalse, census->time); } /* -----------------------------------------------------------------------------