< prev index next >

src/share/vm/gc/g1/g1GCPhaseTimes.cpp

Print this page

        

@@ -104,59 +104,58 @@
       _gc_par_phases[i]->reset();
     }
   }
 }
 
-#define ASSERT_PHASE_UNINITILAIZED(phase) \
+#define ASSERT_PHASE_UNINITILIAZED(phase) \
     assert(_gc_par_phases[phase]->get(i) == uninitialized, "Phase " #phase " reported for thread that was not started");
 
-#define ADD_WORKER_KNOWN_TIME(phase)                \
-    do {                                            \
-      double value = _gc_par_phases[phase]->get(i); \
-      if (value != uninitialized) {                 \
-        worker_known_time += value;                 \
-      }                                             \
-    } while(false)
+double G1GCPhaseTimes::worker_time(GCParPhases phase, uint worker) {
+  double value = _gc_par_phases[phase]->get(worker);
+  if (value != WorkerDataArray<double>::uninitialized()) {
+    return value;
+  }
+  return 0.0;
+}
 
 void G1GCPhaseTimes::note_gc_end() {
   _gc_pause_time_ms = TimeHelper::counter_to_millis(os::elapsed_counter() - _gc_start_counter);
 
-  double uninitialized = _gc_par_phases[GCWorkerStart]->uninitialized();
+  double uninitialized = WorkerDataArray<double>::uninitialized();
 
   for (uint i = 0; i < _max_gc_threads; i++) {
     double worker_start = _gc_par_phases[GCWorkerStart]->get(i);
-    if (worker_start == uninitialized) {
-      // Make sure all slots are uninitialized since this thread did not seem to have been started
-      ASSERT_PHASE_UNINITILAIZED(GCWorkerEnd);
-      ASSERT_PHASE_UNINITILAIZED(ExtRootScan);
-      ASSERT_PHASE_UNINITILAIZED(SATBFiltering);
-      ASSERT_PHASE_UNINITILAIZED(UpdateRS);
-      ASSERT_PHASE_UNINITILAIZED(ScanRS);
-      ASSERT_PHASE_UNINITILAIZED(CodeRoots);
-      ASSERT_PHASE_UNINITILAIZED(ObjCopy);
-      ASSERT_PHASE_UNINITILAIZED(Termination);
-    } else {
-      assert(_gc_par_phases[GCWorkerEnd]->get(i) != _gc_par_phases[GCWorkerEnd]->uninitialized(), "Worker started but not ended.");
-      double worker_time = _gc_par_phases[GCWorkerEnd]->get(i) - _gc_par_phases[GCWorkerStart]->get(i);
-      record_time_secs(GCWorkerTotal, i , worker_time);
-
-      double worker_known_time = 0.0;
-      ADD_WORKER_KNOWN_TIME(ExtRootScan);
-      ADD_WORKER_KNOWN_TIME(SATBFiltering);
-      ADD_WORKER_KNOWN_TIME(UpdateRS);
-      ADD_WORKER_KNOWN_TIME(ScanRS);
-      ADD_WORKER_KNOWN_TIME(CodeRoots);
-      ADD_WORKER_KNOWN_TIME(ObjCopy);
-      ADD_WORKER_KNOWN_TIME(Termination);
+    if (worker_start != uninitialized) {
+      assert(_gc_par_phases[GCWorkerEnd]->get(i) != uninitialized, "Worker started but not ended.");
+      double total_worker_time = _gc_par_phases[GCWorkerEnd]->get(i) - _gc_par_phases[GCWorkerStart]->get(i);
+      record_time_secs(GCWorkerTotal, i , total_worker_time);
+
+      double worker_known_time =
+          worker_time(ExtRootScan, i)
+          + worker_time(SATBFiltering, i)
+          + worker_time(UpdateRS, i)
+          + worker_time(ScanRS, i)
+          + worker_time(CodeRoots, i)
+          + worker_time(ObjCopy, i)
+          + worker_time(Termination, i);
 
-      record_time_secs(Other, i, worker_time - worker_known_time);
+      record_time_secs(Other, i, total_worker_time - worker_known_time);
+    } else {
+      // Make sure all slots are uninitialized since this thread did not seem to have been started
+      ASSERT_PHASE_UNINITILIAZED(GCWorkerEnd);
+      ASSERT_PHASE_UNINITILIAZED(ExtRootScan);
+      ASSERT_PHASE_UNINITILIAZED(SATBFiltering);
+      ASSERT_PHASE_UNINITILIAZED(UpdateRS);
+      ASSERT_PHASE_UNINITILIAZED(ScanRS);
+      ASSERT_PHASE_UNINITILIAZED(CodeRoots);
+      ASSERT_PHASE_UNINITILIAZED(ObjCopy);
+      ASSERT_PHASE_UNINITILIAZED(Termination);
     }
   }
 }
 
-#undef ADD_WORKER_KNOWN_TIME
-#undef ASSERT_PHASE_UNINITILAIZED
+#undef ASSERT_PHASE_UNINITILIAZED
 
 // record the time a phase took in seconds
 void G1GCPhaseTimes::record_time_secs(GCParPhases phase, uint worker_i, double secs) {
   _gc_par_phases[phase]->set(worker_i, secs);
 }
< prev index next >