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