< prev index next >

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

Print this page
rev 53044 : Concurrent stringtable processing

@@ -26,10 +26,11 @@
 
 #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,6 +275,31 @@
   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 >