src/hotspot/share/jfr/recorder/stringpool/jfrStringPoolBuffer.cpp
changeset 50123 f222eba39694
parent 50113 caf115bb98ad
child 50429 83aec1d357d4
--- a/src/hotspot/share/jfr/recorder/stringpool/jfrStringPoolBuffer.cpp	Wed May 16 12:38:34 2018 +0200
+++ b/src/hotspot/share/jfr/recorder/stringpool/jfrStringPoolBuffer.cpp	Wed May 16 12:38:35 2018 +0200
@@ -55,7 +55,17 @@
 }
 
 void JfrStringPoolBuffer::increment(uint64_t value) {
+#if !(defined(ARM) || defined(IA32))
   Atomic::add(value, &_string_count_pos);
+#else
+  // TODO: This should be fixed in Atomic::add handling for 32-bit platforms,
+  // see JDK-8203283. We workaround the absence of support right here.
+  uint64_t cur, val;
+  do {
+     cur = Atomic::load(&_string_count_top);
+     val = cur + value;
+  } while (Atomic::cmpxchg(val, &_string_count_pos, cur) != cur);
+#endif
 }
 
 void JfrStringPoolBuffer::set_string_top(uint64_t value) {