1 /* 2 * Copyright (c) 2018, 2019, Red Hat, Inc. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #include "precompiled.hpp" 26 27 #include "gc/shenandoah/shenandoahHeap.hpp" 28 #include "gc/shenandoah/shenandoahPhaseTimings.hpp" 29 #include "gc/shenandoah/shenandoahTimingTracker.hpp" 30 #include "gc/shenandoah/shenandoahUtils.hpp" 31 #include "runtime/os.hpp" 32 33 34 ShenandoahPhaseTimings::Phase ShenandoahTerminationTracker::_current_termination_phase = ShenandoahPhaseTimings::_num_phases; 35 36 ShenandoahWorkerTimingsTracker::ShenandoahWorkerTimingsTracker(ShenandoahWorkerTimings* worker_times, 37 ShenandoahPhaseTimings::GCParPhases phase, uint worker_id) : 38 _phase(phase), _worker_times(worker_times), _worker_id(worker_id) { 39 if (_worker_times != NULL) { 40 _start_time = os::elapsedTime(); 41 } 42 } 43 44 ShenandoahWorkerTimingsTracker::~ShenandoahWorkerTimingsTracker() { 45 if (_worker_times != NULL) { 46 _worker_times->record_time_secs(_phase, _worker_id, os::elapsedTime() - _start_time); 47 } 48 49 if (ShenandoahGCPhase::is_root_work_phase()) { 50 ShenandoahPhaseTimings::Phase root_phase = ShenandoahGCPhase::current_phase(); 51 ShenandoahPhaseTimings::Phase cur_phase = (ShenandoahPhaseTimings::Phase)((int)root_phase + (int)_phase + 1); 52 _event.commit(GCId::current(), _worker_id, ShenandoahPhaseTimings::phase_name(cur_phase)); 53 } 54 } 55 56 ShenandoahTerminationTimingsTracker::ShenandoahTerminationTimingsTracker(uint worker_id) : 57 _worker_id(worker_id) { 58 if (ShenandoahTerminationTrace) { 59 _start_time = os::elapsedTime(); 60 } 61 } 62 63 ShenandoahTerminationTimingsTracker::~ShenandoahTerminationTimingsTracker() { 64 if (ShenandoahTerminationTrace) { 65 ShenandoahHeap::heap()->phase_timings()->termination_times()->record_time_secs(_worker_id, os::elapsedTime() - _start_time); 66 } 67 } 68 69 ShenandoahTerminationTracker::ShenandoahTerminationTracker(ShenandoahPhaseTimings::Phase phase) : _phase(phase) { 70 assert(_current_termination_phase == ShenandoahPhaseTimings::_num_phases, "Should be invalid"); 71 assert(phase == ShenandoahPhaseTimings::termination || 72 phase == ShenandoahPhaseTimings::final_traversal_gc_termination || 73 phase == ShenandoahPhaseTimings::full_gc_mark_termination || 74 phase == ShenandoahPhaseTimings::conc_termination || 75 phase == ShenandoahPhaseTimings::conc_traversal_termination || 76 phase == ShenandoahPhaseTimings::weakrefs_termination || 77 phase == ShenandoahPhaseTimings::full_gc_weakrefs_termination, 78 "Only these phases"); 79 80 assert(!Thread::current()->is_Worker_thread() && 81 (Thread::current()->is_VM_thread() || 82 Thread::current()->is_ConcurrentGC_thread()), 83 "Called from wrong thread"); 84 85 _current_termination_phase = phase; 86 ShenandoahHeap::heap()->phase_timings()->termination_times()->reset(); 87 } 88 89 ShenandoahTerminationTracker::~ShenandoahTerminationTracker() { 90 assert(_phase == _current_termination_phase, "Can not change phase"); 91 ShenandoahPhaseTimings* phase_times = ShenandoahHeap::heap()->phase_timings(); 92 93 double t = phase_times->termination_times()->average(); 94 phase_times->record_phase_time(_phase, t); 95 debug_only(_current_termination_phase = ShenandoahPhaseTimings::_num_phases;) 96 }