< prev index next >

src/share/vm/gc_implementation/g1/g1GCPhaseTimes.hpp

Print this page
rev 7854 : imported patch 8027962-per-phase-timing-measurements-for-strong-roots-processing

@@ -105,18 +105,41 @@
     _average = (double)_sum / (double)_length;
     _has_new_data = false;
   }
 };
 
+class GCPhaseTimeTracker VALUE_OBJ_CLASS_SPEC {
+private:
+  friend class G1GCPhaseTimes;
+
+  WorkerDataArray<double>** _data;
+  uint _num_phases;
+  uint _worker_id;
+public:
+  GCPhaseTimeTracker(WorkerDataArray<double>** data, uint num_phases, uint worker_id) :
+    _data(data), _num_phases(num_phases), _worker_id(worker_id) { }
+
+  bool active() const { return _num_phases > 0; }
+
+  void set_value(uint phase, double value) {
+    assert(_data != NULL, "just checking");
+    _data[phase]->set(_worker_id, value);
+  }
+};
+
 class G1GCPhaseTimes : public CHeapObj<mtGC> {
 
  private:
   uint _active_gc_threads;
   uint _max_gc_threads;
+  uint _num_ext_root_scan_phases;
+
+  bool track_ext_root_scan_phases() const { return _num_ext_root_scan_phases > 0; }
 
   WorkerDataArray<double> _last_gc_worker_start_times_ms;
   WorkerDataArray<double> _last_ext_root_scan_times_ms;
+  WorkerDataArray<double>** _last_ext_root_scan_phase_times_ms;
   WorkerDataArray<double> _last_satb_filtering_times_ms;
   WorkerDataArray<double> _last_update_rs_times_ms;
   WorkerDataArray<int>    _last_update_rs_processed_buffers;
   WorkerDataArray<double> _last_scan_rs_times_ms;
   WorkerDataArray<double> _last_strong_code_root_scan_times_ms;

@@ -169,11 +192,16 @@
   void print_stats(int level, const char* str, double value);
   void print_stats(int level, const char* str, size_t value);
   void print_stats(int level, const char* str, double value, uint workers);
 
  public:
-  G1GCPhaseTimes(uint max_gc_threads);
+  G1GCPhaseTimes(uint max_gc_threads, uint num_ext_root_scan_phases);
+  virtual ~G1GCPhaseTimes();
+
+  WorkerDataArray<double>** get_ext_root_scan_phase_times() const { return _last_ext_root_scan_phase_times_ms; }
+  uint num_ext_root_scan_phases() const { return _num_ext_root_scan_phases; }
+
   void note_gc_start(uint active_gc_threads);
   void note_gc_end();
   void print(double pause_time_sec);
 
   void record_gc_worker_start_time(uint worker_i, double ms) {
< prev index next >