Add profiling of spinlocks
[ghc-hetmet.git] / rts / Stats.c
index 7059feb..8c24b29 100644 (file)
@@ -16,6 +16,9 @@
 #include "ParTicky.h"                       /* ToDo: move into Rts.h */
 #include "Profiling.h"
 #include "GetTime.h"
+#include "GC.h"
+#include "GCUtils.h"
+#include "Evac.h"
 
 #if USE_PAPI
 #include "Papi.h"
@@ -546,7 +549,7 @@ stat_exit(int alloc)
                         TICK_TO_DBL(GC_coll_etimes[g]));
            }
 
-           statsPrintf("\n%11ld Mb total memory in use\n\n", 
+           statsPrintf("\n%11ld MB total memory in use\n\n", 
                    mblocks_allocated * MBLOCK_SIZE / (1024 * 1024));
 
 #if defined(THREADED_RTS)
@@ -641,6 +644,23 @@ stat_exit(int alloc)
     if (GC_coll_times)
       stgFree(GC_coll_times);
     GC_coll_times = NULL;
+
+#if defined(THREADED_RTS) && defined(PROF_SPIN)
+    {
+       nat g, s;
+
+       statsPrintf("recordMutableGen_sync: %"FMT_Word64"\n", recordMutableGen_sync.spin);
+       statsPrintf("gc_alloc_block_sync: %"FMT_Word64"\n", gc_alloc_block_sync.spin);
+       statsPrintf("static_objects_sync: %"FMT_Word64"\n", static_objects_sync.spin);
+       statsPrintf("whitehole_spin: %"FMT_Word64"\n", whitehole_spin);
+       for (g = 0; g < RtsFlags.GcFlags.generations; g++) {
+           for (s = 0; s < generations[g].n_steps; s++) {
+               statsPrintf("gen[%d].steps[%d].sync_todo: %"FMT_Word64"\n", g, s, generations[g].steps[s].sync_todo.spin);
+               statsPrintf("gen[%d].steps[%d].sync_large_objects: %"FMT_Word64"\n", g, s, generations[g].steps[s].sync_large_objects.spin);
+           }
+       }
+    }
+#endif
 }
 
 /* -----------------------------------------------------------------------------
@@ -676,14 +696,10 @@ statDescribeGens(void)
       for (bd = step->large_objects, lge = 0; bd; bd = bd->link) {
        lge++;
       }
-      live = step->n_large_blocks * BLOCK_SIZE;
-      bd = step->blocks;
       // This live figure will be slightly less that the "live" figure
       // given by +RTS -Sstderr, because we take don't count the
       // slop at the end of each block.
-      for (; bd; bd = bd->link) {
-       live += (bd->free - bd->start) * sizeof(W_);
-      }
+      live += countOccupied(step->blocks) + countOccupied(step->large_objects);
       if (s != 0) {
        debugBelch("%36s","");
       }