src/hotspot/share/gc/shenandoah/shenandoahUtils.cpp
changeset 54687 df2b3565f343
parent 54522 60bc754b9744
child 57798 f0c73a5683e7
child 58678 9cf78a70fa4f
--- a/src/hotspot/share/gc/shenandoah/shenandoahUtils.cpp	Thu May 02 06:33:28 2019 -0700
+++ b/src/hotspot/share/gc/shenandoah/shenandoahUtils.cpp	Thu May 02 09:49:52 2019 -0400
@@ -183,3 +183,47 @@
   ShenandoahThreadLocalData::set_worker_id(thr, ShenandoahThreadLocalData::INVALID_WORKER_ID);
 #endif
 }
+
+struct PhaseMap {
+   WeakProcessorPhases::Phase            _weak_processor_phase;
+   ShenandoahPhaseTimings::GCParPhases   _shenandoah_phase;
+};
+
+static const struct PhaseMap phase_mapping[] = {
+#if INCLUDE_JVMTI
+  {WeakProcessorPhases::jvmti,                 ShenandoahPhaseTimings::JVMTIWeakRoots},
+#endif
+#if INCLUDE_JFR
+  {WeakProcessorPhases::jfr,                   ShenandoahPhaseTimings::JFRWeakRoots},
+#endif
+  {WeakProcessorPhases::jni,                   ShenandoahPhaseTimings::JNIWeakRoots},
+  {WeakProcessorPhases::stringtable,           ShenandoahPhaseTimings::StringTableRoots},
+  {WeakProcessorPhases::resolved_method_table, ShenandoahPhaseTimings::ResolvedMethodTableRoots},
+  {WeakProcessorPhases::vm,                    ShenandoahPhaseTimings::VMWeakRoots}
+};
+
+STATIC_ASSERT(sizeof(phase_mapping) / sizeof(PhaseMap) == WeakProcessorPhases::phase_count);
+
+void ShenandoahTimingConverter::weak_processing_timing_to_shenandoah_timing(WeakProcessorPhaseTimes* weak_processing_timings,
+                                                                            ShenandoahWorkerTimings* sh_worker_times) {
+  assert(weak_processing_timings->max_threads() == weak_processing_timings->max_threads(), "Must match");
+  for (uint index = 0; index < WeakProcessorPhases::phase_count; index ++) {
+    weak_processing_phase_to_shenandoah_phase(phase_mapping[index]._weak_processor_phase,
+                                              weak_processing_timings,
+                                              phase_mapping[index]._shenandoah_phase,
+                                              sh_worker_times);
+  }
+}
+
+void ShenandoahTimingConverter::weak_processing_phase_to_shenandoah_phase(WeakProcessorPhases::Phase wpp,
+                                                                          WeakProcessorPhaseTimes* weak_processing_timings,
+                                                                          ShenandoahPhaseTimings::GCParPhases spp,
+                                                                          ShenandoahWorkerTimings* sh_worker_times) {
+  if (WeakProcessorPhases::is_serial(wpp)) {
+    sh_worker_times->record_time_secs(spp, 0, weak_processing_timings->phase_time_sec(wpp));
+  } else {
+    for (uint index = 0; index < weak_processing_timings->max_threads(); index ++) {
+      sh_worker_times->record_time_secs(spp, index, weak_processing_timings->worker_time_sec(index, wpp));
+    }
+  }
+}