remove empty dir
[ghc-hetmet.git] / ghc / rts / ProfHeap.c
index 3e3e2d6..312bee7 100644 (file)
@@ -153,9 +153,11 @@ 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"
   
@@ -253,6 +255,7 @@ LDV_recordDead( StgClosure *c, nat size )
                if (RtsFlags.ProfFlags.bioSelector == NULL) {
                    censuses[t].void_total   += (int)size;
                    censuses[era].void_total -= (int)size;
+                   ASSERT(censuses[t].void_total < censuses[t].not_used);
                } else {
                    id = closureIdentity(c);
                    ctr = lookupHashTable(censuses[t].hash, (StgWord)id);
@@ -387,7 +390,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));
 }
 
 /* --------------------------------------------------------------------------
@@ -403,7 +406,7 @@ initHeapProfiling(void)
 #ifdef PROFILING
     if (doingLDVProfiling() && doingRetainerProfiling()) {
        errorBelch("cannot mix -hb and -hr");
-       stg_exit(1);
+       stg_exit(EXIT_FAILURE);
     }
 #endif
 
@@ -518,8 +521,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) {
@@ -551,8 +552,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);
@@ -655,6 +654,15 @@ aggregateCensusInfo( void )
        int void_total, drag_total;
 
        // Now we compute void_total and drag_total for each census
+       // After the program has finished, the void_total field of
+       // each census contains the count of words that were *created*
+       // in this era and were eventually void.  Conversely, if a
+       // void closure was destroyed in this era, it will be
+       // represented by a negative count of words in void_total.
+       //
+       // To get the count of live words that are void at each
+       // census, just propagate the void_total count forwards:
+
        void_total = 0;
        drag_total = 0;
        for (t = 1; t < era; t++) { // note: start at 1, not 0
@@ -662,8 +670,15 @@ aggregateCensusInfo( void )
            drag_total += censuses[t].drag_total;
            censuses[t].void_total = void_total;
            censuses[t].drag_total = drag_total;
+
            ASSERT( censuses[t].void_total <= censuses[t].not_used );
+           // should be true because: void_total is the count of
+           // live words that are void at this census, which *must*
+           // be less than the number of live words that have not
+           // been used yet.
+
            ASSERT( censuses[t].drag_total <= censuses[t].used );
+           // similar reasoning as above.
        }
        
        return;
@@ -872,13 +887,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:
@@ -904,7 +919,7 @@ 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
@@ -924,7 +939,8 @@ heapCensusChain( Census *census, bdescr *bd )
            case MVAR:
            case WEAK:
            case STABLE_NAME:
-           case MUT_VAR:
+           case MUT_VAR_CLEAN:
+           case MUT_VAR_DIRTY:
                prim = rtsTrue;
                size = sizeW_fromITBL(info);
                break;
@@ -946,7 +962,8 @@ 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;