lag/drag/void: add an extra assertion, and some commentary
[ghc-hetmet.git] / ghc / rts / ProfHeap.c
index 8c088b7..312bee7 100644 (file)
@@ -255,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);
@@ -389,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));
 }
 
 /* --------------------------------------------------------------------------
@@ -653,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
@@ -660,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;
@@ -870,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:
@@ -902,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