summaryrefslogtreecommitdiff
path: root/rts/Profiling.c
diff options
context:
space:
mode:
authorMatthew Pickering <matthewtpickering@gmail.com>2019-10-09 14:32:13 +0100
committerMatthew Pickering <matthewtpickering@gmail.com>2019-10-16 11:03:18 +0100
commit0ce834af05a0d994ba991d61800124093fa878dd (patch)
tree653eee37cf616b943fd9f8f0f45e1aceb95270af /rts/Profiling.c
parent1357d02380641ba33b05eb87c80e6a4250cd4a3b (diff)
downloadhaskell-wip/ccs-sample-events.tar.gz
eventlog: Dump cost centre stack on each samplewip/ccs-sample-events
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();
};