< prev index next >

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

Print this page
rev 57746 : 8240873: Shenandoah: Short-cut arraycopy barriers
Reviewed-by: shade

*** 291,317 **** } } template <class T> void ShenandoahBarrierSet::arraycopy_pre_work(T* src, T* dst, size_t count) { ! if (_heap->is_concurrent_mark_in_progress()) { arraycopy_work<T, false, false, true>(dst, count); } arraycopy_update_impl(src, count); } void ShenandoahBarrierSet::arraycopy_pre(oop* src, oop* dst, size_t count) { arraycopy_pre_work(src, dst, count); } void ShenandoahBarrierSet::arraycopy_pre(narrowOop* src, narrowOop* dst, size_t count) { arraycopy_pre_work(src, dst, count); } template <class T> void ShenandoahBarrierSet::arraycopy_update_impl(T* src, size_t count) { if (_heap->is_evacuation_in_progress()) { ShenandoahEvacOOMScope oom_evac; arraycopy_work<T, true, true, false>(src, count); } else if (_heap->is_concurrent_traversal_in_progress()){ ShenandoahEvacOOMScope oom_evac; --- 291,325 ---- } } template <class T> void ShenandoahBarrierSet::arraycopy_pre_work(T* src, T* dst, size_t count) { ! if (_heap->is_concurrent_mark_in_progress() && ! !_heap->marking_context()->allocated_after_mark_start(reinterpret_cast<HeapWord*>(dst))) { arraycopy_work<T, false, false, true>(dst, count); } + if (_heap->has_forwarded_objects()) { arraycopy_update_impl(src, count); + } } void ShenandoahBarrierSet::arraycopy_pre(oop* src, oop* dst, size_t count) { arraycopy_pre_work(src, dst, count); } void ShenandoahBarrierSet::arraycopy_pre(narrowOop* src, narrowOop* dst, size_t count) { arraycopy_pre_work(src, dst, count); } + inline bool ShenandoahBarrierSet::skip_bulk_update(HeapWord* dst) { + return dst >= _heap->heap_region_containing(dst)->get_update_watermark(); + } + template <class T> void ShenandoahBarrierSet::arraycopy_update_impl(T* src, size_t count) { + if (skip_bulk_update(reinterpret_cast<HeapWord*>(src))) return; if (_heap->is_evacuation_in_progress()) { ShenandoahEvacOOMScope oom_evac; arraycopy_work<T, true, true, false>(src, count); } else if (_heap->is_concurrent_traversal_in_progress()){ ShenandoahEvacOOMScope oom_evac;
< prev index next >