118 oop obj = CompressedOops::decode_not_null(o);
119 if (_heap->in_collection_set(obj)) {
120 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
121 shenandoah_assert_marked(p, obj);
122 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
123 if (resolved == obj) {
124 resolved = _heap->evacuate_object(obj, _thread);
125 }
126 RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
127 }
128 }
129 }
130 void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) {
131 do_oop_work(p);
132 }
133
134 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
135 do_oop_work(p);
136 }
137
138 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
139 _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
140 }
141
142 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
143 assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress");
144
145 oop obj = RawAccess<>::oop_load(p);
146 if (! CompressedOops::is_null(obj)) {
147 if (_heap->in_collection_set(obj)) {
148 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
149 shenandoah_assert_marked(p, obj);
150 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
151 if (resolved == obj) {
152 resolved = _heap->evacuate_object(obj, _thread);
153 }
154
155 Atomic::cmpxchg(p, obj, resolved);
156 }
157 }
158 }
159
160 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
161 ShouldNotReachHere();
162 }
163
164 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
165 CodeBlobToOopClosure(cl, true /* fix_relocations */),
166 _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
167 }
168
169 void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) {
170 nmethod* const nm = cb->as_nmethod_or_null();
171 if (nm != NULL && nm->oops_do_try_claim()) {
172 assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
173 CodeBlobToOopClosure::do_code_blob(cb);
174 _bs->disarm(nm);
175 }
176 }
177
178 #ifdef ASSERT
179 template <class T>
180 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {
|
118 oop obj = CompressedOops::decode_not_null(o);
119 if (_heap->in_collection_set(obj)) {
120 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
121 shenandoah_assert_marked(p, obj);
122 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
123 if (resolved == obj) {
124 resolved = _heap->evacuate_object(obj, _thread);
125 }
126 RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
127 }
128 }
129 }
130 void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) {
131 do_oop_work(p);
132 }
133
134 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
135 do_oop_work(p);
136 }
137
138 ShenandoahEvacUpdateCleanupRootsClosure::ShenandoahEvacUpdateCleanupRootsClosure() :
139 _heap(ShenandoahHeap::heap()), _thread(Thread::current()), _context(_heap->complete_marking_context()) {
140 }
141
142 void ShenandoahEvacUpdateCleanupRootsClosure::do_oop(oop* p) {
143 assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress");
144
145 oop obj = RawAccess<>::oop_load(p);
146 if (! CompressedOops::is_null(obj)) {
147 if (!_context->is_marked(obj)) {
148 Atomic::cmpxchg(p, obj, (oop)NULL);
149 } else if (_heap->in_collection_set(obj)) {
150 assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
151 shenandoah_assert_marked(p, obj);
152 oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
153 if (resolved == obj) {
154 resolved = _heap->evacuate_object(obj, _thread);
155 }
156 Atomic::cmpxchg(p, obj, resolved);
157 }
158 }
159 }
160
161 void ShenandoahEvacUpdateCleanupRootsClosure::do_oop(narrowOop* p) {
162 ShouldNotReachHere();
163 }
164
165 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
166 CodeBlobToOopClosure(cl, true /* fix_relocations */),
167 _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
168 }
169
170 void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) {
171 nmethod* const nm = cb->as_nmethod_or_null();
172 if (nm != NULL && nm->oops_do_try_claim()) {
173 assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
174 CodeBlobToOopClosure::do_code_blob(cb);
175 _bs->disarm(nm);
176 }
177 }
178
179 #ifdef ASSERT
180 template <class T>
181 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {
|