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