Fixed uninitialised FunBind fun_tick field
[ghc-hetmet.git] / rts / ProfHeap.c
index 8f4c8ba..e93151d 100644 (file)
@@ -19,7 +19,6 @@
 #include "RtsUtils.h"
 #include "RtsFlags.h"
 #include "Profiling.h"
-#include "Storage.h"
 #include "ProfHeap.h"
 #include "Stats.h"
 #include "Hash.h"
@@ -317,6 +316,13 @@ initEra(Census *census)
     census->drag_total = 0;
 }
 
+STATIC_INLINE void
+freeEra(Census *census)
+{
+    arenaFree(census->arena);
+    freeHashTable(census->hash, NULL);
+}
+
 /* --------------------------------------------------------------------------
  * Increases era by 1 and initialize census[era].
  * Reallocates gi[] and increases its size if needed.
@@ -356,6 +362,10 @@ void initProfiling1( void )
 {
 }
 
+void freeProfiling1( void )
+{
+}
+
 void initProfiling2( void )
 {
   if (RtsFlags.ProfFlags.doHeapProfile) {
@@ -386,9 +396,9 @@ printSample(rtsBool beginSample, StgDouble sampleValue)
 {
     StgDouble fractionalPart, integralPart;
     fractionalPart = modf(sampleValue, &integralPart);
-    fprintf(hp_file, "%s %d.%02d\n",
+    fprintf(hp_file, "%s %" FMT_Word64 ".%02" FMT_Word64 "\n",
             (beginSample ? "BEGIN_SAMPLE" : "END_SAMPLE"),
-            (int)integralPart, (int)(fractionalPart * 100));
+            (StgWord64)integralPart, (StgWord64)(fractionalPart * 100));
 }
 
 /* --------------------------------------------------------------------------
@@ -494,6 +504,14 @@ endHeapProfiling(void)
     }
 #endif
 
+    {
+        nat t;
+        for (t = 0; t <= era; t++) {
+            freeEra( &censuses[t] );
+        }
+    }
+    stgFree(censuses);
+
     seconds = mut_user_time();
     printSample(rtsTrue, seconds);
     printSample(rtsFalse, seconds);
@@ -541,10 +559,10 @@ fprint_ccs(FILE *fp, CostCentreStack *ccs, nat max_length)
            p += buf_append(p, ccs->cc->module, buf_end);
            p += buf_append(p, ".CAF", buf_end);
        } else {
+           p += buf_append(p, ccs->cc->label, buf_end);
            if (ccs->prevStack != NULL && ccs->prevStack != CCS_MAIN) {
                p += buf_append(p, "/", buf_end);
            }
-           p += buf_append(p, ccs->cc->label, buf_end);
        }
        
        if (p >= buf_end) {
@@ -806,7 +824,7 @@ dumpCensus( Census *census )
 #ifdef PROFILING
        switch (RtsFlags.ProfFlags.doHeapProfile) {
        case HEAP_BY_CCS:
-           fprint_ccs(hp_file, (CostCentreStack *)ctr->identity, 25);
+           fprint_ccs(hp_file, (CostCentreStack *)ctr->identity, RtsFlags.ProfFlags.ccsLength);
            break;
        case HEAP_BY_MOD:
        case HEAP_BY_DESCR:
@@ -987,9 +1005,19 @@ heapCensusChain( Census *census, bdescr *bd )
                size = sizeofW(StgTRecHeader);
                break;
 
-           case TVAR_WAIT_QUEUE:
+           case TVAR_WATCH_QUEUE:
+               prim = rtsTrue;
+               size = sizeofW(StgTVarWatchQueue);
+               break;
+               
+           case INVARIANT_CHECK_QUEUE:
+               prim = rtsTrue;
+               size = sizeofW(StgInvariantCheckQueue);
+               break;
+               
+           case ATOMIC_INVARIANT:
                prim = rtsTrue;
-               size = sizeofW(StgTVarWaitQueue);
+               size = sizeofW(StgAtomicInvariant);
                break;
                
            case TVAR: