summaryrefslogtreecommitdiff
path: root/rts/Schedule.c
diff options
context:
space:
mode:
authorÖmer Sinan Ağacan <omeragacan@gmail.com>2018-12-28 13:51:28 +0300
committerÖmer Sinan Ağacan <omeragacan@gmail.com>2019-01-12 06:52:38 -0500
commit19670bc397d858b04eb9b4eb01480f7f8c59e2f5 (patch)
tree0e84040446183e032bcd05f2a8c1fd620ba1b9b2 /rts/Schedule.c
parent74cd4ec5d2f9321aad5db3285cb60d78f2562996 (diff)
downloadhaskell-19670bc397d858b04eb9b4eb01480f7f8c59e2f5.tar.gz
Fix negative mutator time in GC stats in prof builds
Because garbage collector calls `retainerProfile()` and `heapCensus()`, GC times normally include some of PROF times too. To fix this we have these lines: // heapCensus() is called by the GC, so RP and HC time are // included in the GC stats. We therefore subtract them to // obtain the actual GC cpu time. stats.gc_cpu_ns -= prof_cpu; stats.gc_elapsed_ns -= prof_elapsed; These variables are later used for calculating GC time excluding the final GC (which should be attributed to EXIT). exit_gc_elapsed = stats.gc_elapsed_ns - start_exit_gc_elapsed; The problem is if we subtract PROF times from `gc_elapsed_ns` and then subtract `start_exit_gc_elapsed` from the result, we end up subtracting PROF times twice, because `start_exit_gc_elapsed` also includes PROF times. We now subtract PROF times from GC after the calculations for EXIT and MUT times. The existing assertion that checks INIT + MUT + GC + EXIT = TOTAL now holds. When we subtract PROF numbers from GC, and a new assertion INIT + MUT + GC + PROF + EXIT = TOTAL also holds. Fixes #15897. New assertions added in this commit also revealed #16102, which is also fixed by this commit.
Diffstat (limited to 'rts/Schedule.c')
-rw-r--r--rts/Schedule.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/rts/Schedule.c b/rts/Schedule.c
index eb9203f783..02055d2566 100644
--- a/rts/Schedule.c
+++ b/rts/Schedule.c
@@ -2018,6 +2018,10 @@ forkProcess(HsStablePtr *entry
} else { // child
+ // Current process times reset in the child process, so we should reset
+ // the stats too. See #16102.
+ resetChildProcessStats();
+
#if defined(THREADED_RTS)
initMutex(&sched_mutex);
initMutex(&sm_mutex);