< prev index next >

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

Print this page
rev 48688 : Access barriers for arraycopy

@@ -76,6 +76,41 @@
     matrix->set_connected(addr, new_value);
   }
   return previous;
 }
 
+template <DecoratorSet decorators, typename BarrierSetT>
+template <typename T>
+bool ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::arraycopy_in_heap(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
+  if (!oopDesc::is_null(src_obj)) {
+    size_t src_offset = pointer_delta((void*) src, (void*) src_obj, sizeof(T));
+    src_obj = arrayOop(((ShenandoahBarrierSet*) BarrierSet::barrier_set())->read_barrier(src_obj));
+    src =  ((T*)(void*) src_obj) + src_offset;
+  }
+  if (!oopDesc::is_null(dst_obj)) {
+    size_t dst_offset = pointer_delta((void*) dst, (void*) dst_obj, sizeof(T));
+    dst_obj = arrayOop(((ShenandoahBarrierSet*) BarrierSet::barrier_set())->write_barrier(dst_obj));
+    dst = ((T*)(void*) dst_obj) + dst_offset;
+  }
+  return Raw::arraycopy(src, dst, length);
+}
+
+template <DecoratorSet decorators, typename BarrierSetT>
+template <typename T>
+bool ShenandoahBarrierSet::AccessBarrier<decorators, BarrierSetT>::oop_arraycopy_in_heap(arrayOop src_obj, arrayOop dst_obj, T* src, T* dst, size_t length) {
+  if (!oopDesc::is_null(src_obj)) {
+    size_t src_offset = pointer_delta((void*) src, (void*) src_obj, sizeof(T));
+    src_obj = arrayOop(((ShenandoahBarrierSet*) BarrierSet::barrier_set())->read_barrier(src_obj));
+    src =  ((T*)(void*) src_obj) + src_offset;
+  }
+  if (!oopDesc::is_null(dst_obj)) {
+    size_t dst_offset = pointer_delta((void*) dst, (void*) dst_obj, sizeof(T));
+    dst_obj = arrayOop(((ShenandoahBarrierSet*) BarrierSet::barrier_set())->write_barrier(dst_obj));
+    dst = ((T*)(void*) dst_obj) + dst_offset;
+  }
+  ((ShenandoahBarrierSet*) BarrierSet::barrier_set())->write_ref_array_pre(dst, length, false);
+  bool success = Raw::oop_arraycopy(src_obj, dst_obj, src, dst, length);
+  ((ShenandoahBarrierSet*) BarrierSet::barrier_set())->write_ref_array((HeapWord*) dst, length);
+  return success;
+}
+
 #endif //SHARE_VM_GC_SHENANDOAH_SHENANDOAHBARRIERSET_INLINE_HPP
< prev index next >