< prev index next >

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

Print this page
rev 52371 : [mq]: lvb.patch

*** 25,54 **** #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP #include "gc/shared/barrierSet.hpp" #include "gc/shenandoah/brooksPointer.inline.hpp" #include "gc/shenandoah/shenandoahBarrierSet.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" - bool ShenandoahBarrierSet::need_update_refs_barrier() { - return _heap->is_update_refs_in_progress() || - _heap->is_concurrent_traversal_in_progress() || - (_heap->is_concurrent_mark_in_progress() && _heap->has_forwarded_objects()); - } - - inline oop ShenandoahBarrierSet::resolve_forwarded_not_null(oop p) { - return BrooksPointer::forwardee(p); - } - - inline oop ShenandoahBarrierSet::resolve_forwarded(oop p) { - if (((HeapWord*) p) != NULL) { - return resolve_forwarded_not_null(p); - } else { - return p; - } - } - template <DecoratorSet decorators, typename BarrierSetT> template <typename T> inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value) { oop res; oop expected = compare_value; --- 25,37 ---- #define SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP #include "gc/shared/barrierSet.hpp" #include "gc/shenandoah/brooksPointer.inline.hpp" #include "gc/shenandoah/shenandoahBarrierSet.hpp" + #include "gc/shenandoah/shenandoahBaseBarrierSet.inline.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" template <DecoratorSet decorators, typename BarrierSetT> template <typename T> inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_atomic_cmpxchg_in_heap(oop new_value, T* addr, oop compare_value) { oop res; oop expected = compare_value;
*** 89,231 **** dst_obj = arrayOop(ShenandoahBarrierSet::barrier_set()->write_barrier(dst_obj)); } Raw::arraycopy(src_obj, src_offset_in_bytes, src_raw, dst_obj, dst_offset_in_bytes, dst_raw, length); } - template <typename T> - bool ShenandoahBarrierSet::arraycopy_loop_1(T* src, T* dst, size_t length, Klass* bound, - bool checkcast, bool satb, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode) { - if (checkcast) { - return arraycopy_loop_2<T, true>(src, dst, length, bound, satb, storeval_mode); - } else { - return arraycopy_loop_2<T, false>(src, dst, length, bound, satb, storeval_mode); - } - } - - template <typename T, bool CHECKCAST> - bool ShenandoahBarrierSet::arraycopy_loop_2(T* src, T* dst, size_t length, Klass* bound, - bool satb, ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode) { - if (satb) { - return arraycopy_loop_3<T, CHECKCAST, true>(src, dst, length, bound, storeval_mode); - } else { - return arraycopy_loop_3<T, CHECKCAST, false>(src, dst, length, bound, storeval_mode); - } - } - - template <typename T, bool CHECKCAST, bool SATB> - bool ShenandoahBarrierSet::arraycopy_loop_3(T* src, T* dst, size_t length, Klass* bound, - ShenandoahBarrierSet::ArrayCopyStoreValMode storeval_mode) { - switch (storeval_mode) { - case NONE: - return arraycopy_loop<T, CHECKCAST, SATB, NONE>(src, dst, length, bound); - case READ_BARRIER: - return arraycopy_loop<T, CHECKCAST, SATB, READ_BARRIER>(src, dst, length, bound); - case WRITE_BARRIER: - return arraycopy_loop<T, CHECKCAST, SATB, WRITE_BARRIER>(src, dst, length, bound); - default: - ShouldNotReachHere(); - return true; // happy compiler - } - } - - template <typename T, bool CHECKCAST, bool SATB, ShenandoahBarrierSet::ArrayCopyStoreValMode STOREVAL_MODE> - bool ShenandoahBarrierSet::arraycopy_loop(T* src, T* dst, size_t length, Klass* bound) { - Thread* thread = Thread::current(); - - ShenandoahEvacOOMScope oom_evac_scope; - - // We need to handle four cases: - // - // a) src < dst, intersecting, can only copy backward only - // [...src...] - // [...dst...] - // - // b) src < dst, non-intersecting, can copy forward/backward - // [...src...] - // [...dst...] - // - // c) src > dst, intersecting, can copy forward only - // [...src...] - // [...dst...] - // - // d) src > dst, non-intersecting, can copy forward/backward - // [...src...] - // [...dst...] - // - if (src > dst) { - // copy forward: - T* cur_src = src; - T* cur_dst = dst; - T* src_end = src + length; - for (; cur_src < src_end; cur_src++, cur_dst++) { - if (!arraycopy_element<T, CHECKCAST, SATB, STOREVAL_MODE>(cur_src, cur_dst, bound, thread)) { - return false; - } - } - } else { - // copy backward: - T* cur_src = src + length - 1; - T* cur_dst = dst + length - 1; - for (; cur_src >= src; cur_src--, cur_dst--) { - if (!arraycopy_element<T, CHECKCAST, SATB, STOREVAL_MODE>(cur_src, cur_dst, bound, thread)) { - return false; - } - } - } - return true; - } - - template <typename T, bool CHECKCAST, bool SATB, ShenandoahBarrierSet::ArrayCopyStoreValMode STOREVAL_MODE> - bool ShenandoahBarrierSet::arraycopy_element(T* cur_src, T* cur_dst, Klass* bound, Thread* thread) { - T o = RawAccess<>::oop_load(cur_src); - - if (SATB) { - T prev = RawAccess<>::oop_load(cur_dst); - if (!CompressedOops::is_null(prev)) { - oop prev_obj = CompressedOops::decode_not_null(prev); - enqueue(prev_obj); - } - } - - if (!CompressedOops::is_null(o)) { - oop obj = CompressedOops::decode_not_null(o); - - if (CHECKCAST) { - assert(bound != NULL, "need element klass for checkcast"); - if (!oopDesc::is_instanceof_or_null(obj, bound)) { - return false; - } - } - - switch (STOREVAL_MODE) { - case NONE: - break; - case READ_BARRIER: - obj = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); - break; - case WRITE_BARRIER: - if (_heap->in_collection_set(obj)) { - oop forw = ShenandoahBarrierSet::resolve_forwarded_not_null(obj); - if (oopDesc::unsafe_equals(forw, obj)) { - forw = _heap->evacuate_object(forw, thread); - } - obj = forw; - } - enqueue(obj); - break; - default: - ShouldNotReachHere(); - } - - RawAccess<IS_NOT_NULL>::oop_store(cur_dst, obj); - } else { - // Store null. - RawAccess<>::oop_store(cur_dst, o); - } - return true; - } - // Clone barrier support template <DecoratorSet decorators, typename BarrierSetT> void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::clone_in_heap(oop src, oop dst, size_t size) { src = arrayOop(ShenandoahBarrierSet::barrier_set()->read_barrier(src)); dst = arrayOop(ShenandoahBarrierSet::barrier_set()->write_barrier(dst)); --- 72,81 ----
*** 239,252 **** 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) { ShenandoahHeap* heap = ShenandoahHeap::heap(); if (!CompressedOops::is_null(src_obj)) { ! src_obj = arrayOop(ShenandoahBarrierSet::barrier_set()->read_barrier(src_obj)); } if (!CompressedOops::is_null(dst_obj)) { ! dst_obj = arrayOop(ShenandoahBarrierSet::barrier_set()->write_barrier(dst_obj)); } bool satb = ShenandoahSATBBarrier && heap->is_concurrent_mark_in_progress(); bool checkcast = HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value; ArrayCopyStoreValMode storeval_mode; --- 89,102 ---- 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) { ShenandoahHeap* heap = ShenandoahHeap::heap(); if (!CompressedOops::is_null(src_obj)) { ! src_obj = arrayOop(ShenandoahBaseBarrierSet::barrier_set()->read_barrier(src_obj)); } if (!CompressedOops::is_null(dst_obj)) { ! dst_obj = arrayOop(ShenandoahBaseBarrierSet::barrier_set()->write_barrier(dst_obj)); } bool satb = ShenandoahSATBBarrier && heap->is_concurrent_mark_in_progress(); bool checkcast = HasDecorator<decorators, ARRAYCOPY_CHECKCAST>::value; ArrayCopyStoreValMode storeval_mode;
*** 271,280 **** src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); Klass* bound = objArrayOop(dst_obj)->element_klass(); ! ShenandoahBarrierSet* bs = ShenandoahBarrierSet::barrier_set(); return bs->arraycopy_loop_1(src_raw, dst_raw, length, bound, checkcast, satb, storeval_mode); } #endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP --- 121,130 ---- src_raw = arrayOopDesc::obj_offset_to_raw(src_obj, src_offset_in_bytes, src_raw); dst_raw = arrayOopDesc::obj_offset_to_raw(dst_obj, dst_offset_in_bytes, dst_raw); Klass* bound = objArrayOop(dst_obj)->element_klass(); ! ShenandoahBaseBarrierSet* bs = ShenandoahBaseBarrierSet::barrier_set(); return bs->arraycopy_loop_1(src_raw, dst_raw, length, bound, checkcast, satb, storeval_mode); } #endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
< prev index next >