hotspot/src/share/vm/oops/typeArrayKlass.cpp
changeset 5119 7bf54ea07181
parent 3576 4ceec8fb3e18
child 5547 f4b087cbb361
--- a/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Wed Jul 05 17:03:51 2017 +0200
+++ b/hotspot/src/share/vm/oops/typeArrayKlass.cpp	Thu Dec 03 14:20:22 2009 -0800
@@ -123,16 +123,16 @@
      || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) {
     THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException());
   }
+  // Check zero copy
+  if (length == 0)
+    return;
 
   // This is an attempt to make the copy_array fast.
-  // NB: memmove takes care of overlapping memory segments.
-  // Potential problem: memmove is not guaranteed to be word atomic
-  // Revisit in Merlin
   int l2es = log2_element_size();
   int ihs = array_header_in_bytes() / wordSize;
-  char* src = (char*) ((oop*)s + ihs) + (src_pos << l2es);
-  char* dst = (char*) ((oop*)d + ihs) + (dst_pos << l2es);
-  memmove(dst, src, length << l2es);
+  char* src = (char*) ((oop*)s + ihs) + ((size_t)src_pos << l2es);
+  char* dst = (char*) ((oop*)d + ihs) + ((size_t)dst_pos << l2es);
+  Copy::conjoint_memory_atomic(src, dst, (size_t)length << l2es);
 }