< 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 >