< 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

*** 109,124 **** _heap(ShenandoahHeap::heap()), _thread(Thread::current()) { } template <class T> void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p) { ! assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); T o = RawAccess<>::oop_load(p); if (! CompressedOops::is_null(o)) { oop obj = CompressedOops::decode_not_null(o); if (_heap->in_collection_set(obj)) { shenandoah_assert_marked(p, obj); oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (resolved == obj) { resolved = _heap->evacuate_object(obj, _thread); } --- 109,125 ---- _heap(ShenandoahHeap::heap()), _thread(Thread::current()) { } template <class T> void ShenandoahEvacuateUpdateRootsClosure::do_oop_work(T* p) { ! assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress"); T o = RawAccess<>::oop_load(p); if (! CompressedOops::is_null(o)) { oop obj = CompressedOops::decode_not_null(o); if (_heap->in_collection_set(obj)) { + assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); shenandoah_assert_marked(p, obj); oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (resolved == obj) { resolved = _heap->evacuate_object(obj, _thread); }
*** 132,163 **** void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) { do_oop_work(p); } ! ShenandoahEvacUpdateOopStorageRootsClosure::ShenandoahEvacUpdateOopStorageRootsClosure() : ! _heap(ShenandoahHeap::heap()), _thread(Thread::current()) { } ! void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(oop* p) { ! assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); oop obj = RawAccess<>::oop_load(p); if (! CompressedOops::is_null(obj)) { ! if (_heap->in_collection_set(obj)) { shenandoah_assert_marked(p, obj); oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (resolved == obj) { resolved = _heap->evacuate_object(obj, _thread); } - Atomic::cmpxchg(p, obj, resolved); } } } ! void ShenandoahEvacUpdateOopStorageRootsClosure::do_oop(narrowOop* p) { ShouldNotReachHere(); } ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) : CodeBlobToOopClosure(cl, true /* fix_relocations */), --- 133,166 ---- void ShenandoahEvacuateUpdateRootsClosure::do_oop(narrowOop* p) { do_oop_work(p); } ! ShenandoahEvacUpdateCleanupRootsClosure::ShenandoahEvacUpdateCleanupRootsClosure() : ! _heap(ShenandoahHeap::heap()), _thread(Thread::current()), _context(_heap->complete_marking_context()) { } ! void ShenandoahEvacUpdateCleanupRootsClosure::do_oop(oop* p) { ! assert(_heap->is_concurrent_root_in_progress(), "Only do this when evacuation is in progress"); oop obj = RawAccess<>::oop_load(p); if (! CompressedOops::is_null(obj)) { ! if (!_context->is_marked(obj)) { ! Atomic::cmpxchg(p, obj, (oop)NULL); ! } else if (_heap->in_collection_set(obj)) { ! assert(_heap->is_evacuation_in_progress(), "Only do this when evacuation is in progress"); shenandoah_assert_marked(p, obj); oop resolved = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); if (resolved == obj) { resolved = _heap->evacuate_object(obj, _thread); } Atomic::cmpxchg(p, obj, resolved); } } } ! void ShenandoahEvacUpdateCleanupRootsClosure::do_oop(narrowOop* p) { ShouldNotReachHere(); } ShenandoahCodeBlobAndDisarmClosure::ShenandoahCodeBlobAndDisarmClosure(OopClosure* cl) : CodeBlobToOopClosure(cl, true /* fix_relocations */),
< prev index next >