1.1 --- a/src/share/vm/oops/typeArrayKlass.cpp Thu Nov 12 15:35:38 2009 -0800 1.2 +++ b/src/share/vm/oops/typeArrayKlass.cpp Thu Dec 03 14:20:22 2009 -0800 1.3 @@ -123,16 +123,16 @@ 1.4 || (((unsigned int) length + (unsigned int) dst_pos) > (unsigned int) d->length()) ) { 1.5 THROW(vmSymbols::java_lang_ArrayIndexOutOfBoundsException()); 1.6 } 1.7 + // Check zero copy 1.8 + if (length == 0) 1.9 + return; 1.10 1.11 // This is an attempt to make the copy_array fast. 1.12 - // NB: memmove takes care of overlapping memory segments. 1.13 - // Potential problem: memmove is not guaranteed to be word atomic 1.14 - // Revisit in Merlin 1.15 int l2es = log2_element_size(); 1.16 int ihs = array_header_in_bytes() / wordSize; 1.17 - char* src = (char*) ((oop*)s + ihs) + (src_pos << l2es); 1.18 - char* dst = (char*) ((oop*)d + ihs) + (dst_pos << l2es); 1.19 - memmove(dst, src, length << l2es); 1.20 + char* src = (char*) ((oop*)s + ihs) + ((size_t)src_pos << l2es); 1.21 + char* dst = (char*) ((oop*)d + ihs) + ((size_t)dst_pos << l2es); 1.22 + Copy::conjoint_memory_atomic(src, dst, (size_t)length << l2es); 1.23 } 1.24 1.25