< prev index next >

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

Print this page

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