< prev index next >

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

Print this page
rev 57380 : 8234974: Shenandoah: Do concurrent roots even when no evacuation is necessary
rev 57381 : [mq]: JDK-8234974-changes.patch


 118     oop obj = CompressedOops::decode_not_null(o);
 119     if (_heap->in_collection_set(obj)) {
 120       assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 121       shenandoah_assert_marked(p, obj);
 122       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
 123       if (resolved == obj) {
 124         resolved = _heap->evacuate_object(obj, _thread);
 125       }
 126       RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
 127     }
 128   }
 129 }
 130 void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) {
 131   do_oop_work(p);
 132 }
 133 
 134 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
 135   do_oop_work(p);
 136 }
 137 
 138 ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() :
 139   _heap(ShenandoahHeap::heap()), _thread(Thread::current()) {
 140 }
 141 
 142 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) {
 143   assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress");
 144 
 145   oop obj = RawAccess<>::oop_load(p);
 146   if (! CompressedOops::is_null(obj)) {
 147     if (_heap->in_collection_set(obj)) {


 148       assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 149       shenandoah_assert_marked(p, obj);
 150       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
 151       if (resolved == obj) {
 152         resolved = _heap->evacuate_object(obj, _thread);
 153       }
 154 
 155       Atomic::cmpxchg(p, obj, resolved);
 156     }
 157   }
 158 }
 159 
 160 void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) {
 161   ShouldNotReachHere();
 162 }
 163 
 164 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
 165   CodeBlobToOopClosure(cl, true /* fix_relocations */),
 166    _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
 167 }
 168 
 169 void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) {
 170   nmethod* const nm = cb->as_nmethod_or_null();
 171   if (nm != NULL && nm->oops_do_try_claim()) {
 172     assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
 173     CodeBlobToOopClosure::do_code_blob(cb);
 174     _bs->disarm(nm);
 175   }
 176 }
 177 
 178 #ifdef ASSERT
 179 template <class T>
 180 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {


 118     oop obj = CompressedOops::decode_not_null(o);
 119     if (_heap->in_collection_set(obj)) {
 120       assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 121       shenandoah_assert_marked(p, obj);
 122       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
 123       if (resolved == obj) {
 124         resolved = _heap->evacuate_object(obj, _thread);
 125       }
 126       RawAccess<IS_NOT_NULL>::oop_store(p, resolved);
 127     }
 128   }
 129 }
 130 void ShenandoahEvacuateUpdateRootsClosure::do_oop(oop* p) {
 131   do_oop_work(p);
 132 }
 133 
 134 void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) {
 135   do_oop_work(p);
 136 }
 137 
 138 ShenandoahEvacUpdateCleanupRootsClosure::ShenandoahEvacUpdateCleanupRootsClosure() :
 139   _heap(ShenandoahHeap::heap()), _thread(Thread::current()), _context(_heap->complete_marking_context()) {
 140 }
 141 
 142 void ShenandoahEvacUpdateCleanupRootsClosure::do_oop(oop* p) {
 143   assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress");
 144 
 145   oop obj = RawAccess<>::oop_load(p);
 146   if (! CompressedOops::is_null(obj)) {
 147     if (!_context->is_marked(obj)) {
 148       Atomic::cmpxchg(p, obj, (oop)NULL);
 149     } else if (_heap->in_collection_set(obj)) {
 150       assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress");
 151       shenandoah_assert_marked(p, obj);
 152       oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj);
 153       if (resolved == obj) {
 154         resolved = _heap->evacuate_object(obj, _thread);
 155       }

 156       Atomic::cmpxchg(p, obj, resolved);
 157     }
 158   }
 159 }
 160 
 161 void ShenandoahEvacUpdateCleanupRootsClosure::do_oop(narrowOop* p) {
 162   ShouldNotReachHere();
 163 }
 164 
 165 ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) :
 166   CodeBlobToOopClosure(cl, true /* fix_relocations */),
 167    _bs(BarrierSet::barrier_set()->barrier_set_nmethod()) {
 168 }
 169 
 170 void ShenandoahCodeBlobAndDisarmClosure::do_code_blob(CodeBlob* cb) {
 171   nmethod* const nm = cb->as_nmethod_or_null();
 172   if (nm != NULL && nm->oops_do_try_claim()) {
 173     assert(!ShenandoahNMethod::gc_data(nm)->is_unregistered(), "Should not be here");
 174     CodeBlobToOopClosure::do_code_blob(cb);
 175     _bs->disarm(nm);
 176   }
 177 }
 178 
 179 #ifdef ASSERT
 180 template <class T>
 181 void ShenandoahAssertNotForwardedClosure::do_oop_work(T* p) {
< prev index next >