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()); |