summaryrefslogtreecommitdiff
path: root/rts/Profiling.c
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2019-10-09 14:32:13 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-10-23 05:58:58 -0400
commit17987a4b665d4a270b1bebba1f61d67887f2653c (patch)
tree922a01003b495c1a0cdf9457f7ecbb4985e20578 /rts/Profiling.c
parentb521e8b698cc415684fbc0ea5ddfab51077cb144 (diff)
downloadhaskell-17987a4b665d4a270b1bebba1f61d67887f2653c.tar.gz
eventlog: Dump cost centre stack on each sample
With this change it is possible to reconstruct the timing portion of a `.prof` file after the fact. By logging the stacks at each time point a more precise executation trace of the program can be observed rather than all identical cost centres being identified in the report. There are two new events: 1. `EVENT_PROF_BEGIN` - emitted at the start of profiling to communicate the tick interval 2. `EVENT_PROF_SAMPLE_COST_CENTRE` - emitted on each tick to communicate the current call stack. Fixes #17322
Diffstat (limited to 'rts/Profiling.c')
-rw-r--r--rts/Profiling.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/rts/Profiling.c b/rts/Profiling.c
index b91129ed98..a4247c7809 100644
--- a/rts/Profiling.c
+++ b/rts/Profiling.c
@@ -25,7 +25,7 @@
#include <fs_rts.h>
#include <string.h>
-#if defined(DEBUG)
+#if defined(DEBUG) || defined(PROFILING)
#include "Trace.h"
#endif
@@ -132,6 +132,19 @@ static void initProfilingLogFile ( void );
Initialise the profiling environment
-------------------------------------------------------------------------- */
+static void
+dumpCostCentresToEventLog(void)
+{
+#if defined(PROFILING)
+ CostCentre *cc, *next;
+ for (cc = CC_LIST; cc != NULL; cc = next) {
+ next = cc->link;
+ traceHeapProfCostCentre(cc->ccID, cc->label, cc->module,
+ cc->srcloc, cc->is_caf);
+ }
+#endif
+}
+
void initProfiling (void)
{
// initialise our arena
@@ -187,8 +200,12 @@ void initProfiling (void)
if (RtsFlags.CcFlags.doCostCentres) {
initTimeProfiling();
}
+
+ dumpCostCentresToEventLog();
}
+
+
//
// Should be called after loading any new Haskell code.
//
@@ -278,6 +295,7 @@ initProfilingLogFile(void)
void
initTimeProfiling(void)
{
+ traceProfBegin();
/* Start ticking */
startProfTimer();
};