< prev index next >

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

Print this page
rev 56375 : 8231447: Shenandoah: Compilation-time regression after JDK-8231086

*** 184,194 **** // Clone barrier support template <DecoratorSet decorators, typename BarrierSetT> void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) { if (ShenandoahCloneBarrier) { ! ShenandoahBarrierSet::barrier_set()->clone_barrier(src); } Raw::clone(src, dst, size); } template <DecoratorSet decorators, typename BarrierSetT> --- 184,194 ---- // Clone barrier support template <DecoratorSet decorators, typename BarrierSetT> void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) { if (ShenandoahCloneBarrier) { ! ShenandoahBarrierSet::barrier_set()->clone_barrier_runtime(src); } Raw::clone(src, dst, size); } template <DecoratorSet decorators, typename BarrierSetT>
*** 271,339 **** void ShenandoahBarrierSet::arraycopy_update(narrowOop* src, size_t count) { arraycopy_update_impl(src, count); } - template <bool EVAC, bool ENQUEUE> - class ShenandoahUpdateRefsForOopClosure: public BasicOopIterateClosure { - private: - ShenandoahHeap* const _heap; - ShenandoahBarrierSet* const _bs; - const ShenandoahCollectionSet* const _cset; - Thread* const _thread; - - template <class T> - inline void do_oop_work(T* p) { - T o = RawAccess<>::oop_load(p); - if (!CompressedOops::is_null(o)) { - oop obj = CompressedOops::decode_not_null(o); - if (_cset->is_in((HeapWord *)obj)) { - oop fwd = _bs->resolve_forwarded_not_null(obj); - if (EVAC && obj == fwd) { - fwd = _heap->evacuate_object(obj, _thread); - } - if (ENQUEUE) { - _bs->enqueue(fwd); - } - assert(obj != fwd || _heap->cancelled_gc(), "must be forwarded"); - ShenandoahHeap::cas_oop(fwd, p, o); - } - - } - } - public: - ShenandoahUpdateRefsForOopClosure() : - _heap(ShenandoahHeap::heap()), - _bs(ShenandoahBarrierSet::barrier_set()), - _cset(_heap->collection_set()), - _thread(Thread::current()) { - } - - virtual void do_oop(oop* p) { do_oop_work(p); } - virtual void do_oop(narrowOop* p) { do_oop_work(p); } - }; - - void ShenandoahBarrierSet::clone_barrier(oop obj) { - assert(ShenandoahCloneBarrier, "only get here with clone barriers enabled"); - if (!_heap->has_forwarded_objects()) return; - - // This is called for cloning an object (see jvm.cpp) after the clone - // has been made. We are not interested in any 'previous value' because - // it would be NULL in any case. But we *are* interested in any oop* - // that potentially need to be updated. - - shenandoah_assert_correct(NULL, obj); - if (_heap->is_evacuation_in_progress()) { - ShenandoahEvacOOMScope evac_scope; - ShenandoahUpdateRefsForOopClosure</* evac = */ true, /* enqueue */ false> cl; - obj->oop_iterate(&cl); - } else if (_heap->is_concurrent_traversal_in_progress()) { - ShenandoahEvacOOMScope evac_scope; - ShenandoahUpdateRefsForOopClosure</* evac = */ true, /* enqueue */ true> cl; - obj->oop_iterate(&cl); - } else { - ShenandoahUpdateRefsForOopClosure</* evac = */ false, /* enqueue */ false> cl; - obj->oop_iterate(&cl); - } - } - #endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP --- 271,276 ----
< prev index next >