< prev index next >

src/hotspot/share/gc/shenandoah/shenandoahClosures.inline.hpp

Print this page

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);
< prev index next >