< prev index next >
src/hotspot/share/gc/shenandoah/shenandoahBarrierSet.inline.hpp
Print this page
rev 58671 : 8242130: Shenandoah: Simplify arraycopy-barrier dispatching
rev 58672 : Shenandoah: New incremental-update mode
*** 84,94 ****
enqueue(value);
}
}
inline void ShenandoahBarrierSet::storeval_barrier(oop obj) {
! if (obj != NULL && ShenandoahStoreValEnqueueBarrier) {
enqueue(obj);
}
}
inline void ShenandoahBarrierSet::keep_alive_if_weak(DecoratorSet decorators, oop value) {
--- 84,94 ----
enqueue(value);
}
}
inline void ShenandoahBarrierSet::storeval_barrier(oop obj) {
! if (ShenandoahStoreValEnqueueBarrier && obj != NULL && _heap->is_concurrent_mark_in_progress()) {
enqueue(obj);
}
}
inline void ShenandoahBarrierSet::keep_alive_if_weak(DecoratorSet decorators, oop value) {
*** 247,257 ****
template <typename T>
bool ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
size_t length) {
ShenandoahBarrierSet* bs = ShenandoahBarrierSet::barrier_set();
! bs->arraycopy_pre(arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw),
arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw),
length);
return Raw::oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length);
}
--- 247,257 ----
template <typename T>
bool ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap(arrayOop src_obj, size_t src_offset_in_bytes, T* src_raw,
arrayOop dst_obj, size_t dst_offset_in_bytes, T* dst_raw,
size_t length) {
ShenandoahBarrierSet* bs = ShenandoahBarrierSet::barrier_set();
! bs->arraycopy_barrier(arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw),
arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw),
length);
return Raw::oop_arraycopy_in_heap(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length);
}
*** 283,330 ****
}
}
}
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->has_forwarded_objects()) {
- arraycopy_work<T, true, false, false>(src, count);
}
}
! void ShenandoahBarrierSet::arraycopy_update(oop* src, size_t count) {
! arraycopy_update_impl(src, count);
! }
!
! void ShenandoahBarrierSet::arraycopy_update(narrowOop* src, size_t count) {
! arraycopy_update_impl(src, count);
}
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
--- 283,332 ----
}
}
}
template <class T>
! void ShenandoahBarrierSet::arraycopy_barrier(T* src, T* dst, size_t count) {
! if (count == 0) {
! return;
! }
! int gc_state = _heap->gc_state();
! if ((gc_state & ShenandoahHeap::MARKING) != 0) {
! arraycopy_marking(src, dst, count);
! } else if ((gc_state & ShenandoahHeap::EVACUATION) != 0) {
! arraycopy_evacuation(src, count);
! } else if ((gc_state & ShenandoahHeap::UPDATEREFS) != 0) {
! arraycopy_update(src, count);
}
}
! template <class T>
! void ShenandoahBarrierSet::arraycopy_marking(T* src, T* dst, size_t count) {
! assert(_heap->is_concurrent_mark_in_progress(), "only during marking");
! T* array = ShenandoahSATBBarrier ? dst : src;
! if (!_heap->marking_context()->allocated_after_mark_start(reinterpret_cast<HeapWord*>(array))) {
! arraycopy_work<T, false, false, true>(array, count);
! }
}
! inline bool ShenandoahBarrierSet::need_bulk_update(HeapWord* ary) {
! return ary < _heap->heap_region_containing(ary)->get_update_watermark();
}
template <class T>
! void ShenandoahBarrierSet::arraycopy_evacuation(T* src, size_t count) {
! assert(_heap->is_evacuation_in_progress(), "only during evacuation");
! if (need_bulk_update(reinterpret_cast<HeapWord*>(src))) {
ShenandoahEvacOOMScope oom_evac;
arraycopy_work<T, true, true, false>(src, count);
}
}
! template <class T>
! void ShenandoahBarrierSet::arraycopy_update(T* src, size_t count) {
! assert(_heap->is_update_refs_in_progress(), "only during update-refs");
! if (need_bulk_update(reinterpret_cast<HeapWord*>(src))) {
! arraycopy_work<T, true, false, false>(src, count);
! }
}
#endif // SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
< prev index next >