[project @ 2000-03-14 01:31:38 by sof]
[ghc-hetmet.git] / ghc / rts / Stats.c
index 64bd175..547ca27 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Stats.c,v 1.17 1999/11/09 15:46:57 simonmar Exp $
+ * $Id: Stats.c,v 1.20 2000/01/12 15:15:18 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -160,9 +160,15 @@ elapsedtime(void)
 
 /* mut_user_time_during_GC() and mut_user_time()
  *
- * This function can be used to get the current mutator time *during*
- * a GC, i.e. between stat_startGC and stat_endGC.  This is used in
- * the heap profiler for accurately time stamping the heap sample.
+ * The former function can be used to get the current mutator time
+ * *during* a GC, i.e. between stat_startGC and stat_endGC.  This is
+ * used in the heap profiler for accurately time stamping the heap
+ * sample.  
+ *
+ * ATTENTION: mut_user_time_during_GC() relies on GC_start_time being 
+ *           defined in stat_startGC() - to minimise system calls, 
+ *           GC_start_time is, however, only defined when really needed (check
+ *           stat_startGC() for details)
  */
 double
 mut_user_time_during_GC(void)
@@ -327,6 +333,7 @@ stat_startExit(void)
   MutUserTime = usertime();
 #else
   MutUserTime = usertime() - GC_tot_time - InitUserTime;
+  if (MutUserTime < 0) { MutUserTime = 0; }
 #endif
 }
 
@@ -353,6 +360,11 @@ stat_endExit(void)
 
 static nat rub_bell = 0;
 
+/*  initialise global variables needed during GC
+ *
+ *  * GC_start_time is read in mut_user_time_during_GC(), which in turn is 
+ *    needed if either PROFILING or DEBUGing is enabled
+ */
 void
 stat_startGC(void)
 {
@@ -369,8 +381,14 @@ stat_startGC(void)
        }
     }
 
+#if defined(PROFILING) || defined(DEBUG)
+    GC_start_time = usertime();  /* needed in mut_user_time_during_GC() */
+#endif
+
     if (sf != NULL) {
-       GC_start_time = usertime();
+#if !defined(PROFILING) && !defined(DEBUG)
+        GC_start_time = usertime();
+#endif
        GCe_start_time = elapsedtime();
        if (RtsFlags.GcFlags.giveStats) {
          GC_start_faults = pagefaults();
@@ -390,8 +408,8 @@ stat_endGC(lnat alloc, lnat collect, lnat live, lnat copied, lnat gen)
     if (sf != NULL) {
        double time     = usertime();
        double etime    = elapsedtime();
-       double gc_time  = time-GC_start_time;
-       double gc_etime = etime-GCe_start_time;
+       double gc_time  = time - GC_start_time;
+       double gc_etime = etime - GCe_start_time;
 
        if (RtsFlags.GcFlags.giveStats >= VERBOSE_GC_STATS) {
            nat faults = pagefaults();
@@ -402,7 +420,7 @@ stat_endGC(lnat alloc, lnat collect, lnat live, lnat copied, lnat gen)
                    gc_time, 
                    gc_etime,
                    time,
-                   etime,
+                   etime - ElapsedTimeStart,
                    faults - GC_start_faults,
                    GC_start_faults - GC_end_faults,
                    gen);
@@ -411,7 +429,7 @@ stat_endGC(lnat alloc, lnat collect, lnat live, lnat copied, lnat gen)
            fflush(sf);
        }
 
-       GC_coll_times[gen] += time-GC_start_time;
+       GC_coll_times[gen] += gc_time;
 
        GC_tot_copied += (ullong) copied;
        GC_tot_alloc  += (ullong) alloc;
@@ -423,7 +441,7 @@ stat_endGC(lnat alloc, lnat collect, lnat live, lnat copied, lnat gen)
          nat i;
          pthread_t me = pthread_self();
 
-         for (i = 0; i < RtsFlags.ConcFlags.nNodes; i++) {
+         for (i = 0; i < RtsFlags.ParFlags.nNodes; i++) {
            if (me == task_ids[i].id) {
              task_ids[i].gc_time += gc_time;
              task_ids[i].gc_etime += gc_etime;
@@ -461,7 +479,7 @@ stat_workerStop(void)
   nat i;
   pthread_t me = pthread_self();
 
-  for (i = 0; i < RtsFlags.ConcFlags.nNodes; i++) {
+  for (i = 0; i < RtsFlags.ParFlags.nNodes; i++) {
     if (task_ids[i].id == me) {
       task_ids[i].mut_time = usertime() - task_ids[i].gc_time;
       task_ids[i].mut_etime = elapsedtime()
@@ -534,7 +552,7 @@ stat_exit(int alloc)
        {
          nat i;
          MutUserTime = 0.0;
-         for (i = 0; i < RtsFlags.ConcFlags.nNodes; i++) {
+         for (i = 0; i < RtsFlags.ParFlags.nNodes; i++) {
            MutUserTime += task_ids[i].mut_time;
            fprintf(sf, "  Task %2d:  MUT time: %6.2fs  (%6.2fs elapsed)\n"
                        "            GC  time: %6.2fs  (%6.2fs elapsed)\n\n",