130 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
131 do_oop_work(p);
132 }
133
134 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
135 _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
136 }
137
138 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
139 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
140
141 oop obj = RawAccess<>::oop_load(p);
142 if (! CompressedOops::is_null(obj)) {
143 if (_heap->in_collection_set(obj)) {
144 shenandoah_assert_marked(p, obj);
145 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
146 if (resolved == obj) {
147 resolved = _heap->evacuate_object(obj, _thread);
148 }
149
150 Atomic::cmpxchg(resolved, p, obj);
151 }
152 }
153 }
154
155 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
156 ShouldNotReachHere();
157 }
158
159 #ifdef ASSERT
160 template <class T>
161 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {
162 T o = RawAccess<>::oop_load(p);
163 if (!CompressedOops::is_null(o)) {
164 oop obj = CompressedOops::decode_not_null(o);
165 shenandoah_assert_not_forwarded(p, obj);
166 }
167 }
168
169 void ShenandoahAssertNotForwardedClosure::do_oop(narrowOop* p) { do_oop_work(p); }
170 void ShenandoahAssertNotForwardedClosure::do_oop(oop* p) { do_oop_work(p); }
|
130 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
131 do_oop_work(p);
132 }
133
134 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
135 _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
136 }
137
138 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
139 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
140
141 oop obj = RawAccess<>::oop_load(p);
142 if (! CompressedOops::is_null(obj)) {
143 if (_heap->in_collection_set(obj)) {
144 shenandoah_assert_marked(p, obj);
145 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
146 if (resolved == obj) {
147 resolved = _heap->evacuate_object(obj, _thread);
148 }
149
150 Atomic::cmpxchg(p, obj, resolved);
151 }
152 }
153 }
154
155 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
156 ShouldNotReachHere();
157 }
158
159 #ifdef ASSERT
160 template <class T>
161 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {
162 T o = RawAccess<>::oop_load(p);
163 if (!CompressedOops::is_null(o)) {
164 oop obj = CompressedOops::decode_not_null(o);
165 shenandoah_assert_not_forwarded(p, obj);
166 }
167 }
168
169 void ShenandoahAssertNotForwardedClosure::do_oop(narrowOop* p) { do_oop_work(p); }
170 void ShenandoahAssertNotForwardedClosure::do_oop(oop* p) { do_oop_work(p); }
|