< prev index next >

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

Print this page
rev 55320 : 8225483: Shenandoah: Enhance native access barrier

*** 23,32 **** --- 23,33 ---- #ifndef SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP #define SHARE_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP #include "gc/shared/barrierSet.hpp" + #include "gc/shenandoah/shenandoahAsserts.hpp" #include "gc/shenandoah/shenandoahBarrierSet.hpp" #include "gc/shenandoah/shenandoahForwarding.inline.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" #include "gc/shenandoah/shenandoahHeapRegion.hpp" #include "gc/shenandoah/shenandoahMarkingContext.inline.hpp"
*** 63,73 **** template <DecoratorSet decorators, typename BarrierSetT> template <typename T> inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) { oop value = Raw::oop_load_not_in_heap(addr); ! value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(value); keep_alive_if_weak(decorators, value); return value; } template <DecoratorSet decorators, typename BarrierSetT> --- 64,83 ---- template <DecoratorSet decorators, typename BarrierSetT> template <typename T> inline oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) { oop value = Raw::oop_load_not_in_heap(addr); ! if (CompressedOops::is_null(value)) return value; ! ! // There are roots that are processed during concurrent evacuation phase. This barrier ! // ensures that it does not load unreachable references, by returning NULL instead. ! ShenandoahHeap* const heap = ShenandoahHeap::heap(); ! if (heap->is_evacuation_in_progress() && !heap->complete_marking_context()->is_marked(value)) { ! return NULL; ! } ! ! value = ShenandoahBarrierSet::barrier_set()->load_reference_barrier_not_null(value); keep_alive_if_weak(decorators, value); return value; } template <DecoratorSet decorators, typename BarrierSetT>
*** 79,88 **** --- 89,107 ---- ShenandoahBarrierSet::barrier_set()->write_ref_field_pre_work(addr, value); } Raw::oop_store_in_heap(addr, value); } + #ifdef ASSERT + template <DecoratorSet decorators, typename BarrierSetT> + template <typename T> + inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_not_in_heap(T* addr, oop value) { + shenandoah_assert_marked_if(NULL, value, !CompressedOops::is_null(value) && ShenandoahHeap::heap()->is_evacuation_in_progress()); + Raw::oop_store(addr, value); + } + #endif + template <DecoratorSet decorators, typename BarrierSetT> inline void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_in_heap_at(oop base, ptrdiff_t offset, oop value) { oop_store_in_heap(AccessInternal::oop_field_addr<decorators>(base, offset), value); }
< prev index next >