Skip to content
  • Ömer Sinan Ağacan's avatar
    Fix negative mutator time in GC stats in prof builds · 19670bc3
    Ömer Sinan Ağacan authored
    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.
    19670bc3