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 (closed). New assertions added in this commit also revealed #16102 (closed), which is also fixed by this commit.