equal
deleted
inserted
replaced
90 if (! CompressedOops::is_null(o)) { |
90 if (! CompressedOops::is_null(o)) { |
91 oop obj = CompressedOops::decode_not_null(o); |
91 oop obj = CompressedOops::decode_not_null(o); |
92 if (_heap->in_collection_set(obj)) { |
92 if (_heap->in_collection_set(obj)) { |
93 shenandoah_assert_marked(p, obj); |
93 shenandoah_assert_marked(p, obj); |
94 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); |
94 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); |
95 if (oopDesc::equals_raw(resolved, obj)) { |
95 if (resolved == obj) { |
96 resolved = _heap->evacuate_object(obj, _thread); |
96 resolved = _heap->evacuate_object(obj, _thread); |
97 } |
97 } |
98 RawAccess<IS_NOT_NULL>::oop_store(p, resolved); |
98 RawAccess<IS_NOT_NULL>::oop_store(p, resolved); |
99 } |
99 } |
100 } |
100 } |
103 do_oop_work(p); |
103 do_oop_work(p); |
104 } |
104 } |
105 |
105 |
106 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) { |
106 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) { |
107 do_oop_work(p); |
107 do_oop_work(p); |
|
108 } |
|
109 |
|
110 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() : |
|
111 _heap(ShenandoahHeap::heap()), _thread(Thread::current()) { |
|
112 } |
|
113 |
|
114 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) { |
|
115 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); |
|
116 |
|
117 oop obj = RawAccess<>::oop_load(p); |
|
118 if (! CompressedOops::is_null(obj)) { |
|
119 if (_heap->in_collection_set(obj)) { |
|
120 shenandoah_assert_marked(p, obj); |
|
121 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); |
|
122 if (resolved == obj) { |
|
123 resolved = _heap->evacuate_object(obj, _thread); |
|
124 } |
|
125 |
|
126 Atomic::cmpxchg(resolved, p, obj); |
|
127 } |
|
128 } |
|
129 } |
|
130 |
|
131 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) { |
|
132 ShouldNotReachHere(); |
108 } |
133 } |
109 |
134 |
110 #ifdef ASSERT |
135 #ifdef ASSERT |
111 template <class T> |
136 template <class T> |
112 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) { |
137 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) { |