< prev index next >

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

Print this page
rev 53044 : Concurrent stringtable processing

*** 26,35 **** --- 26,36 ---- #include "gc/shared/barrierSet.hpp" #include "gc/shenandoah/brooksPointer.inline.hpp" #include "gc/shenandoah/shenandoahBarrierSet.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" + #include "gc/shenandoah/shenandoahMarkingContext.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());
*** 274,279 **** --- 275,305 ---- 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); } + template <DecoratorSet decorators, typename BarrierSetT> + template <typename T> + oop ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_load_not_in_heap(T* addr) { + oop value = Raw::oop_load_not_in_heap(addr); + // In order to support concurrent reference cleaning (and similar + // constructs like concurrent string table cleaning) return + // logical NULL here if phantom ref and real oop is unreachable. + ShenandoahHeap* heap = ShenandoahHeap::heap(); + if (heap->is_refcleaning_in_progress() && + (decorators & ON_PHANTOM_OOP_REF) != 0 && + value != NULL && + !heap->complete_marking_context()->is_marked(value)) { + return NULL; + } + keep_alive_if_weak(decorators, value); + return value; + } + + template <DecoratorSet decorators, typename BarrierSetT> + template <typename T> + void ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_store_not_in_heap(T* addr, oop value) { + value = ShenandoahBarrierSet::barrier_set()->storeval_barrier(value); + Raw::oop_store_not_in_heap(addr, value); + } + #endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
< prev index next >