src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp
changeset 58729 15f4471787b9
parent 58177 4932dce35882
--- a/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp	Mon Oct 21 21:36:26 2019 +0100
+++ b/src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp	Mon Oct 21 22:44:48 2019 +0200
@@ -35,12 +35,13 @@
 #include "oops/compressedOops.inline.hpp"
 #include "oops/oop.inline.hpp"
 
-template <class T, bool STRING_DEDUP, bool DEGEN>
+template <class T, bool STRING_DEDUP, bool DEGEN, bool ATOMIC_UPDATE>
 void ShenandoahTraversalGC::process_oop(T* p, Thread* thread, ShenandoahObjToScanQueue* queue, ShenandoahMarkingContext* const mark_context) {
   T o = RawAccess<>::oop_load(p);
   if (!CompressedOops::is_null(o)) {
     oop obj = CompressedOops::decode_not_null(o);
     if (DEGEN) {
+      assert(!ATOMIC_UPDATE, "Degen path assumes non-atomic updates");
       oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
       if (obj != forw) {
         // Update reference.
@@ -54,7 +55,11 @@
       }
       shenandoah_assert_forwarded_except(p, obj, _heap->cancelled_gc());
       // Update reference.
-      ShenandoahHeap::cas_oop(forw, p, obj);
+      if (ATOMIC_UPDATE) {
+        ShenandoahHeap::cas_oop(forw, p, obj);
+      } else {
+        RawAccess<IS_NOT_NULL>::oop_store(p, forw);
+      }
       obj = forw;
     }