[project @ 2003-12-23 10:10:53 by simonmar]
[ghc-hetmet.git] / ghc / rts / Proftimer.c
index ae63670..dc36df9 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Proftimer.c,v 1.6 2000/04/03 15:54:49 simonmar Exp $
+ * $Id: Proftimer.c,v 1.12 2003/02/22 04:51:52 sof Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -9,34 +9,80 @@
 
 #if defined (PROFILING)
 
+#include "PosixSource.h"
+
+#include <stdio.h>
+
 #include "Rts.h"
 #include "Profiling.h"
-#include "Itimer.h"
+#include "Timer.h"
 #include "Proftimer.h"
+#include "RtsFlags.h"
+
+static rtsBool do_prof_ticks = rtsFalse;       // enable profiling ticks
+static rtsBool do_heap_prof_ticks = rtsFalse;  // enable heap profiling ticks
+
+// Number of ticks until next heap census
+static int ticks_to_heap_profile;
 
-rtsBool do_prof_ticks = rtsFalse;       /* enable profiling ticks */
+// Time for a heap profile on the next context switch
+rtsBool performHeapProfile;
 
 void
-stopProfTimer(void)
-{                              /* Stops time profile */
-    if (time_profiling) {
-       do_prof_ticks = rtsFalse;
-    }
-};
+stopProfTimer( void )
+{
+    do_prof_ticks = rtsFalse;
+}
+
+void
+startProfTimer( void )
+{
+    do_prof_ticks = rtsTrue;
+}
+
+void
+stopHeapProfTimer( void )
+{
+    do_heap_prof_ticks = rtsFalse;
+}
 
 void
-startProfTimer(void)
-{                              /* Starts time profile */
-    if (time_profiling) {
-       do_prof_ticks = rtsTrue;
+startHeapProfTimer( void )
+{
+    if (RtsFlags.ProfFlags.doHeapProfile && 
+       RtsFlags.ProfFlags.profileIntervalTicks > 0) {
+       do_heap_prof_ticks = rtsTrue;
     }
-};
+}
+
+void
+initProfTimer( void )
+{
+    performHeapProfile = rtsFalse;
+
+    RtsFlags.ProfFlags.profileIntervalTicks = 
+       RtsFlags.ProfFlags.profileInterval / TICK_MILLISECS;
+
+    ticks_to_heap_profile = RtsFlags.ProfFlags.profileIntervalTicks;
+
+    startHeapProfTimer();
+}
+
 
 void
 handleProfTick(void)
 {
     if (do_prof_ticks) {
-       CCS_TICK(CCCS);
+       CCCS->time_ticks++;
+    }
+
+    if (do_heap_prof_ticks) {
+       ticks_to_heap_profile--;
+       if (ticks_to_heap_profile <= 0) {
+           ticks_to_heap_profile = RtsFlags.ProfFlags.profileIntervalTicks;
+           performHeapProfile = rtsTrue;
+       }
     }
 }
+
 #endif /* PROFILING */