192 oop obj = RawAccess<>::oop_load(p);
193 if (!CompressedOops::is_null(obj)) {
194 if (_is_alive->do_object_b(obj)) {
195 _keep_alive->do_oop(p);
196 } else {
197 if (CONCURRENT) {
198 ShenandoahHeap::atomic_clear_oop(p, obj);
199 } else {
200 RawAccess<IS_NOT_NULL>::oop_store(p, oop());
201 }
202 }
203 }
204 }
205
206 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
207 void ShenandoahCleanUpdateWeakOopsClosure<CONCURRENT, IsAlive, KeepAlive>::do_oop(narrowOop* p) {
208 ShouldNotReachHere();
209 }
210
211 ShenandoahNMethodAndDisarmClosure::ShenandoahNMethodAndDisarmClosure(OopClosure* cl) :
212 NMethodToOopClosure(cl, true /* fix_relocations */),
213 _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
214 }
215
216 void ShenandoahNMethodAndDisarmClosure::do_nmethod(nmethod* nm) {
217 assert(nm != nullptr, "Sanity");
218 assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
219 NMethodToOopClosure::do_nmethod(nm);
220 _bs->disarm(nm);
221 }
222
223
224 //
225 // ========= Update References
226 //
227
228 template <ShenandoahGenerationType GENERATION>
229 ShenandoahMarkUpdateRefsClosure<GENERATION>::ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q,
230 ShenandoahReferenceProcessor* rp,
231 ShenandoahObjToScanQueue* old_q) :
232 ShenandoahMarkRefsSuperClosure(q, rp, old_q) {
233 assert(_heap->is_stw_gc_in_progress(), "Can only be used for STW GC");
234 }
235
236 template<ShenandoahGenerationType GENERATION>
237 template<class T>
238 inline void ShenandoahMarkUpdateRefsClosure<GENERATION>::work(T* p) {
239 // Update the location
240 _heap->non_conc_update_with_forwarded(p);
|
192 oop obj = RawAccess<>::oop_load(p);
193 if (!CompressedOops::is_null(obj)) {
194 if (_is_alive->do_object_b(obj)) {
195 _keep_alive->do_oop(p);
196 } else {
197 if (CONCURRENT) {
198 ShenandoahHeap::atomic_clear_oop(p, obj);
199 } else {
200 RawAccess<IS_NOT_NULL>::oop_store(p, oop());
201 }
202 }
203 }
204 }
205
206 template <bool CONCURRENT, typename IsAlive, typename KeepAlive>
207 void ShenandoahCleanUpdateWeakOopsClosure<CONCURRENT, IsAlive, KeepAlive>::do_oop(narrowOop* p) {
208 ShouldNotReachHere();
209 }
210
211 ShenandoahNMethodAndDisarmClosure::ShenandoahNMethodAndDisarmClosure(OopClosure* cl) :
212 NMethodToOopClosure(cl, true /* fix_relocations */) {}
213
214 void ShenandoahNMethodAndDisarmClosure::do_nmethod(nmethod* nm) {
215 assert(nm != nullptr, "Sanity");
216 assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
217 NMethodToOopClosure::do_nmethod(nm);
218 ShenandoahNMethod::disarm_nmethod(nm);
219 }
220
221
222 //
223 // ========= Update References
224 //
225
226 template <ShenandoahGenerationType GENERATION>
227 ShenandoahMarkUpdateRefsClosure<GENERATION>::ShenandoahMarkUpdateRefsClosure(ShenandoahObjToScanQueue* q,
228 ShenandoahReferenceProcessor* rp,
229 ShenandoahObjToScanQueue* old_q) :
230 ShenandoahMarkRefsSuperClosure(q, rp, old_q) {
231 assert(_heap->is_stw_gc_in_progress(), "Can only be used for STW GC");
232 }
233
234 template<ShenandoahGenerationType GENERATION>
235 template<class T>
236 inline void ShenandoahMarkUpdateRefsClosure<GENERATION>::work(T* p) {
237 // Update the location
238 _heap->non_conc_update_with_forwarded(p);
|