src/hotspot/share/gc/shenandoah/shenandoahTraversalGC.inline.hpp
changeset 58729 15f4471787b9
parent 58177 4932dce35882
equal deleted inserted replaced
58728:6d5c7f91e0b5 58729:15f4471787b9
    33 #include "gc/shenandoah/shenandoahTaskqueue.hpp"
    33 #include "gc/shenandoah/shenandoahTaskqueue.hpp"
    34 #include "gc/shenandoah/shenandoahTaskqueue.inline.hpp"
    34 #include "gc/shenandoah/shenandoahTaskqueue.inline.hpp"
    35 #include "oops/compressedOops.inline.hpp"
    35 #include "oops/compressedOops.inline.hpp"
    36 #include "oops/oop.inline.hpp"
    36 #include "oops/oop.inline.hpp"
    37 
    37 
    38 template <class T, bool STRING_DEDUP, bool DEGEN>
    38 template <class T, bool STRING_DEDUP, bool DEGEN, bool ATOMIC_UPDATE>
    39 void ShenandoahTraversalGC::process_oop(T* p, Thread* thread, ShenandoahObjToScanQueue* queue, ShenandoahMarkingContext* const mark_context) {
    39 void ShenandoahTraversalGC::process_oop(T* p, Thread* thread, ShenandoahObjToScanQueue* queue, ShenandoahMarkingContext* const mark_context) {
    40   T o = RawAccess<>::oop_load(p);
    40   T o = RawAccess<>::oop_load(p);
    41   if (!CompressedOops::is_null(o)) {
    41   if (!CompressedOops::is_null(o)) {
    42     oop obj = CompressedOops::decode_not_null(o);
    42     oop obj = CompressedOops::decode_not_null(o);
    43     if (DEGEN) {
    43     if (DEGEN) {
       
    44       assert(!ATOMIC_UPDATE, "Degen path assumes non-atomic updates");
    44       oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    45       oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
    45       if (obj != forw) {
    46       if (obj != forw) {
    46         // Update reference.
    47         // Update reference.
    47         RawAccess<IS_NOT_NULL>::oop_store(p, forw);
    48         RawAccess<IS_NOT_NULL>::oop_store(p, forw);
    48       }
    49       }
    52       if (obj == forw) {
    53       if (obj == forw) {
    53         forw = _heap->evacuate_object(obj, thread);
    54         forw = _heap->evacuate_object(obj, thread);
    54       }
    55       }
    55       shenandoah_assert_forwarded_except(p, obj, _heap->cancelled_gc());
    56       shenandoah_assert_forwarded_except(p, obj, _heap->cancelled_gc());
    56       // Update reference.
    57       // Update reference.
    57       ShenandoahHeap::cas_oop(forw, p, obj);
    58       if (ATOMIC_UPDATE) {
       
    59         ShenandoahHeap::cas_oop(forw, p, obj);
       
    60       } else {
       
    61         RawAccess<IS_NOT_NULL>::oop_store(p, forw);
       
    62       }
    58       obj = forw;
    63       obj = forw;
    59     }
    64     }
    60 
    65 
    61     shenandoah_assert_not_forwarded(p, obj);
    66     shenandoah_assert_not_forwarded(p, obj);
    62     shenandoah_assert_not_in_cset_except(p, obj, _heap->cancelled_gc());
    67     shenandoah_assert_not_in_cset_except(p, obj, _heap->cancelled_gc());