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