src/hotspot/share/gc/shared/workerDataArray.inline.hpp
changeset 59198 92c98aa0f801
parent 55510 3e31a8beaae4
--- a/src/hotspot/share/gc/shared/workerDataArray.inline.hpp	Wed Nov 20 14:16:29 2019 +0100
+++ b/src/hotspot/share/gc/shared/workerDataArray.inline.hpp	Thu Nov 21 11:42:54 2019 +0100
@@ -30,11 +30,13 @@
 #include "utilities/ostream.hpp"
 
 template <typename T>
-WorkerDataArray<T>::WorkerDataArray(uint length, const char* title) :
+WorkerDataArray<T>::WorkerDataArray(uint length, const char* title, bool is_serial) :
  _data(NULL),
  _length(length),
- _title(title) {
+ _title(title),
+ _is_serial(is_serial) {
   assert(length > 0, "Must have some workers to store data for");
+  assert(!is_serial || length == 1, "Serial phase must only have a single entry.");
   _data = NEW_C_HEAP_ARRAY(T, _length, mtGC);
   for (uint i = 0; i < MaxThreadWorkItems; i++) {
     _thread_work_items[i] = NULL;
@@ -139,30 +141,39 @@
 
 template <class T>
 void WorkerDataArray<T>::print_summary_on(outputStream* out, bool print_sum) const {
-  out->print("%-25s", title());
+  if (_is_serial) {
+    out->print("%s:", title());
+  } else {
+    out->print("%-25s", title());
+  }
+
   uint start = 0;
   while (start < _length && get(start) == uninitialized()) {
     start++;
   }
   if (start < _length) {
-    T min = get(start);
-    T max = min;
-    T sum = 0;
-    uint contributing_threads = 0;
-    for (uint i = start; i < _length; ++i) {
-      T value = get(i);
-      if (value != uninitialized()) {
-        max = MAX2(max, value);
-        min = MIN2(min, value);
-        sum += value;
-        contributing_threads++;
+    if (_is_serial) {
+      WDAPrinter::summary(out, get(0));
+    } else {
+      T min = get(start);
+      T max = min;
+      T sum = 0;
+      uint contributing_threads = 0;
+      for (uint i = start; i < _length; ++i) {
+        T value = get(i);
+        if (value != uninitialized()) {
+          max = MAX2(max, value);
+          min = MIN2(min, value);
+          sum += value;
+          contributing_threads++;
+        }
       }
+      T diff = max - min;
+      assert(contributing_threads != 0, "Must be since we found a used value for the start index");
+      double avg = sum / (double) contributing_threads;
+      WDAPrinter::summary(out, min, avg, max, diff, sum, print_sum);
+      out->print_cr(", Workers: %d", contributing_threads);
     }
-    T diff = max - min;
-    assert(contributing_threads != 0, "Must be since we found a used value for the start index");
-    double avg = sum / (double) contributing_threads;
-    WDAPrinter::summary(out, min, avg, max, diff, sum, print_sum);
-    out->print_cr(", Workers: %d", contributing_threads);
   } else {
     // No data for this phase.
     out->print_cr(" skipped");