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