# HG changeset patch
# User shade
# Date 1527774182 -7200
# Node ID ecdf81479e0ff7f93d5ff63af057eb079a5dad62
# Parent  df4a4e873da5ef0c3acd752f38fdd8bcf8e22f5f
Multiple threads should print/update counters once

diff -r df4a4e873da5 -r ecdf81479e0f src/hotspot/share/gc/epsilon/epsilonHeap.cpp
--- a/src/hotspot/share/gc/epsilon/epsilonHeap.cpp	Thu May 31 14:50:56 2018 +0200
+++ b/src/hotspot/share/gc/epsilon/epsilonHeap.cpp	Thu May 31 15:43:02 2018 +0200
@@ -144,18 +144,23 @@
     res = _space->par_allocate(size);
   }
 
+  size_t used = _space->used();
+
   // Allocation successful, update counters
-  size_t used = _space->used();
-  if (used - _last_counter_update >= _step_counter_update) {
-    _last_counter_update = used;
-    _monitoring_support->update_counters();
+  {
+    size_t last = _last_counter_update;
+    if ((used - last >= _step_counter_update) && Atomic::cmpxchg(used, &_last_counter_update, last) == last) {
+      _monitoring_support->update_counters();
+    }
   }
 
   // ...and print the occupancy line, if needed
-  if (used - _last_heap_print >= _step_heap_print) {
-    log_info(gc)("Heap: " SIZE_FORMAT "M reserved, " SIZE_FORMAT "M committed, " SIZE_FORMAT "M used",
-                 max_capacity() / M, capacity() / M, used / M);
-    _last_heap_print = used;
+  {
+    size_t last = _last_heap_print;
+    if ((used - last >= _step_heap_print) && Atomic::cmpxchg(used, &_last_heap_print, last) == last) {
+      log_info(gc)("Heap: " SIZE_FORMAT "M reserved, " SIZE_FORMAT "M committed, " SIZE_FORMAT "M used",
+                   max_capacity() / M, capacity() / M, used / M);
+    }
   }
 
   return res;
diff -r df4a4e873da5 -r ecdf81479e0f src/hotspot/share/gc/epsilon/epsilonHeap.hpp
--- a/src/hotspot/share/gc/epsilon/epsilonHeap.hpp	Thu May 31 14:50:56 2018 +0200
+++ b/src/hotspot/share/gc/epsilon/epsilonHeap.hpp	Thu May 31 15:43:02 2018 +0200
@@ -44,11 +44,11 @@
   ContiguousSpace* _space;
   VirtualSpace _virtual_space;
   size_t _max_tlab_size;
-  size_t _last_counter_update;
-  size_t _last_heap_print;
   size_t _step_counter_update;
   size_t _step_heap_print;
   int64_t _decay_time_ns;
+  volatile size_t _last_counter_update;
+  volatile size_t _last_heap_print;
 
 public:
   static EpsilonHeap* heap();