You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/12/05 12:46:33 UTC
ignite git commit: IGNITE-4295: Added specialized methods for memory
copying,
depending on their nature (heap/offheap). Heap->heap copying is now performed
using System.arraycopy when possible. Also it is possible to fallback to
byte-by-byte copying unti
Repository: ignite
Updated Branches:
refs/heads/master 6d348aeda -> 530d8c8de
IGNITE-4295: Added specialized methods for memory copying, depending on their nature (heap/offheap). Heap->heap copying is now performed using System.arraycopy when possible. Also it is possible to fallback to byte-by-byte copying until certain threshold is reached (see IgniteSystemProperties.IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD); it could be useful on some JDK implementations with inefficient Unsafe copy routines. E.g. on OpenJDK 8 for PowerPC. This closes #1282.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/530d8c8d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/530d8c8d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/530d8c8d
Branch: refs/heads/master
Commit: 530d8c8de7e29dedcef1d7032a9320b442dc9dd3
Parents: 6d348ae
Author: devozerov <vo...@gridgain.com>
Authored: Mon Dec 5 15:42:24 2016 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Mon Dec 5 15:42:24 2016 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 8 +++
.../internal/binary/BinaryPrimitives.java | 6 +-
.../binary/streams/BinaryHeapInputStream.java | 4 +-
.../binary/streams/BinaryHeapOutputStream.java | 2 +-
.../streams/BinaryMemoryAllocatorChunk.java | 3 +-
.../streams/BinaryOffheapInputStream.java | 4 +-
.../streams/BinaryOffheapOutputStream.java | 4 +-
.../memory/PlatformInputStreamImpl.java | 4 +-
.../memory/PlatformOutputStreamImpl.java | 2 +-
.../ignite/internal/util/GridHandleTable.java | 10 ++--
.../apache/ignite/internal/util/GridUnsafe.java | 60 ++++++++++++++++++--
.../ignite/internal/util/IgniteUtils.java | 32 +----------
.../internal/util/io/GridUnsafeDataInput.java | 12 ++--
.../internal/util/io/GridUnsafeDataOutput.java | 12 ++--
.../util/offheap/unsafe/GridUnsafeMemory.java | 10 ++--
.../binary/BinaryFieldsOffheapSelfTest.java | 2 +-
.../BinaryFooterOffsetsOffheapSelfTest.java | 2 +-
.../binary/BinaryMarshallerSelfTest.java | 2 +-
...naryObjectBuilderDefaultMappersSelfTest.java | 2 +-
.../hadoop/shuffle/HadoopShuffleJob.java | 2 +-
.../hadoop/shuffle/HadoopShuffleMessage.java | 2 +-
.../shuffle/streams/HadoopDataOutStream.java | 2 +-
.../HadoopConcurrentHashMultimapSelftest.java | 2 +-
.../collections/HadoopSkipListSelfTest.java | 2 +-
24 files changed, 108 insertions(+), 83 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 9429a6f..b83b5ef 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -500,6 +500,14 @@ public final class IgniteSystemProperties {
public static final String IGNITE_MEMORY_UNALIGNED_ACCESS = "IGNITE_MEMORY_UNALIGNED_ACCESS";
/**
+ * When unsafe memory copy if performed below this threshold, Ignite will do it on per-byte basis instead of
+ * calling to Unsafe.copyMemory().
+ * <p>
+ * Defaults to 0, meaning that threshold is disabled.
+ */
+ public static final String IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD = "IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD";
+
+ /**
* Enforces singleton.
*/
private IgniteSystemProperties() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
index 86f5040..556282d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java
@@ -60,7 +60,7 @@ public abstract class BinaryPrimitives {
public static byte[] readByteArray(byte[] arr, int off, int len) {
byte[] arr0 = new byte[len];
- GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF + off, arr0, GridUnsafe.BYTE_ARR_OFF, len);
+ System.arraycopy(arr, off, arr0, 0, len);
return arr0;
}
@@ -73,7 +73,7 @@ public abstract class BinaryPrimitives {
public static byte[] readByteArray(long ptr, int off, int len) {
byte[] arr0 = new byte[len];
- GridUnsafe.copyMemory(null, ptr + off, arr0, GridUnsafe.BYTE_ARR_OFF, len);
+ GridUnsafe.copyOffheapHeap(ptr + off, arr0, GridUnsafe.BYTE_ARR_OFF, len);
return arr0;
}
@@ -215,7 +215,7 @@ public abstract class BinaryPrimitives {
public static char[] readCharArray(long ptr, int off, int len) {
char[] arr0 = new char[len];
- GridUnsafe.copyMemory(null, ptr + off, arr0, GridUnsafe.CHAR_ARR_OFF, len << 1);
+ GridUnsafe.copyOffheapHeap(ptr + off, arr0, GridUnsafe.CHAR_ARR_OFF, len << 1);
if (BIG_ENDIAN) {
for (int i = 0; i < len; i++)
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java
index b5edc02..322894e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java
@@ -78,7 +78,7 @@ public final class BinaryHeapInputStream extends BinaryAbstractInputStream {
if (data.length < len) {
byte[] data0 = new byte[len];
- GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, data0, GridUnsafe.BYTE_ARR_OFF, data.length);
+ System.arraycopy(data, 0, data0, 0, data.length);
data = data0;
}
@@ -105,7 +105,7 @@ public final class BinaryHeapInputStream extends BinaryAbstractInputStream {
@Override public byte[] arrayCopy() {
byte[] res = new byte[len];
- GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, res, GridUnsafe.BYTE_ARR_OFF, res.length);
+ System.arraycopy(data, 0, res, 0, len);
return res;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java
index f06c980..17bcdf6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java
@@ -75,7 +75,7 @@ public final class BinaryHeapOutputStream extends BinaryAbstractOutputStream {
@Override public byte[] arrayCopy() {
byte[] res = new byte[pos];
- GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, res, GridUnsafe.BYTE_ARR_OFF, pos);
+ System.arraycopy(data, 0, res, 0, pos);
return res;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java
index f9db7da..09f8c3f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java
@@ -17,7 +17,6 @@
package org.apache.ignite.internal.binary.streams;
-import org.apache.ignite.internal.util.GridUnsafe;
import org.apache.ignite.internal.util.typedef.internal.U;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHAL_BUFFERS_RECHECK;
@@ -72,7 +71,7 @@ public class BinaryMemoryAllocatorChunk {
if (this.data == data)
this.data = newData;
- GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, newData, GridUnsafe.BYTE_ARR_OFF, data.length);
+ System.arraycopy(data, 0, newData, 0, data.length);
return newData;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java
index 9dc92c6..6f505b9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java
@@ -79,7 +79,7 @@ public class BinaryOffheapInputStream extends BinaryAbstractInputStream {
@Override public byte[] arrayCopy() {
byte[] res = new byte[len];
- GridUnsafe.copyMemory(null, ptr, res, GridUnsafe.BYTE_ARR_OFF, res.length);
+ GridUnsafe.copyOffheapHeap(ptr, res, GridUnsafe.BYTE_ARR_OFF, res.length);
return res;
}
@@ -96,7 +96,7 @@ public class BinaryOffheapInputStream extends BinaryAbstractInputStream {
/** {@inheritDoc} */
@Override protected void copyAndShift(Object target, long off, int len) {
- GridUnsafe.copyMemory(null, ptr + pos, target, off, len);
+ GridUnsafe.copyOffheapHeap(ptr + pos, target, off, len);
shift(len);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java
index be9f7d3..d16e575 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java
@@ -77,7 +77,7 @@ public class BinaryOffheapOutputStream extends BinaryAbstractOutputStream {
@Override public byte[] arrayCopy() {
byte[] res = new byte[pos];
- GridUnsafe.copyMemory(null, ptr, res, GridUnsafe.BYTE_ARR_OFF, pos);
+ GridUnsafe.copyOffheapHeap(ptr, res, GridUnsafe.BYTE_ARR_OFF, pos);
return res;
}
@@ -101,7 +101,7 @@ public class BinaryOffheapOutputStream extends BinaryAbstractOutputStream {
/** {@inheritDoc} */
@Override protected void copyAndShift(Object src, long offset, int len) {
- GridUnsafe.copyMemory(src, offset, null, ptr + pos, len);
+ GridUnsafe.copyHeapOffheap(src, offset, ptr + pos, len);
shift(len);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
index 859de39..f5b2c3a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java
@@ -286,7 +286,7 @@ public class PlatformInputStreamImpl implements PlatformInputStream {
if (dataCopy == null) {
dataCopy = new byte[len];
- GridUnsafe.copyMemory(null, data, dataCopy, GridUnsafe.BYTE_ARR_OFF, dataCopy.length);
+ GridUnsafe.copyOffheapHeap(data, dataCopy, GridUnsafe.BYTE_ARR_OFF, dataCopy.length);
}
return dataCopy;
@@ -334,7 +334,7 @@ public class PlatformInputStreamImpl implements PlatformInputStream {
private void copyAndShift(Object target, long off, int cnt) {
ensureEnoughData(cnt);
- GridUnsafe.copyMemory(null, data + pos, target, off, cnt);
+ GridUnsafe.copyOffheapHeap(data + pos, target, off, cnt);
shift(cnt);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
index 1ece10b..334afb8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java
@@ -334,7 +334,7 @@ public class PlatformOutputStreamImpl implements PlatformOutputStream {
private void copyAndShift(Object src, long off, int len) {
ensureCapacity(pos + len);
- GridUnsafe.copyMemory(src, off, null, data + pos, len);
+ GridUnsafe.copyHeapOffheap(src, off, data + pos, len);
shift(len);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
index 41a4da9..aace1ed 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java
@@ -19,8 +19,6 @@ package org.apache.ignite.internal.util;
import java.util.Arrays;
-import static org.apache.ignite.internal.util.GridUnsafe.INT_ARR_OFF;
-
/**
* Lightweight identity hash table which maps objects to integer handles,
* assigned in ascending order.
@@ -109,8 +107,8 @@ public class GridHandleTable {
* Resets table to its initial (empty) state.
*/
public void clear() {
- GridUnsafe.copyMemory(spineEmpty, INT_ARR_OFF, spine, INT_ARR_OFF, spineEmpty.length << 2);
- GridUnsafe.copyMemory(nextEmpty, INT_ARR_OFF, next, INT_ARR_OFF, nextEmpty.length << 2);
+ System.arraycopy(spineEmpty, 0, spine, 0, spineEmpty.length);
+ System.arraycopy(nextEmpty, 0, next, 0, nextEmpty.length);
Arrays.fill(objs, null);
@@ -151,7 +149,7 @@ public class GridHandleTable {
Arrays.fill(spineEmpty, -1);
- GridUnsafe.copyMemory(spineEmpty, INT_ARR_OFF, spine, INT_ARR_OFF, spineEmpty.length << 2);
+ System.arraycopy(spineEmpty, 0, spine, 0, spineEmpty.length);
for (int i = 0; i < this.size; i++) {
Object obj = objs[i];
@@ -169,7 +167,7 @@ public class GridHandleTable {
int newLen = (next.length << 1) + 1;
int[] newNext = new int[newLen];
- GridUnsafe.copyMemory(next, INT_ARR_OFF, newNext, INT_ARR_OFF, size << 2);
+ System.arraycopy(next, 0, newNext, 0, size);
next = newNext;
nextEmpty = new int[newLen];
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
index 35b793a..6e9efdb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java
@@ -51,6 +51,10 @@ public abstract class GridUnsafe {
/** Unaligned flag. */
private static final boolean UNALIGNED = unaligned();
+ /** Per-byte copy threshold. */
+ private static final long PER_BYTE_THRESHOLD =
+ IgniteSystemProperties.getLong(IgniteSystemProperties.IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD, 0L);
+
/** Big endian. */
public static final boolean BIG_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN;
@@ -1027,14 +1031,53 @@ public abstract class GridUnsafe {
}
/**
- * Copies memory.
+ * Copy memory between offheap locations.
+ *
+ * @param srcAddr Source address.
+ * @param dstAddr Destination address.
+ * @param len Length.
+ */
+ public static void copyOffheapOffheap(long srcAddr, long dstAddr, long len) {
+ if (len <= PER_BYTE_THRESHOLD) {
+ for (int i = 0; i < len; i++)
+ UNSAFE.putByte(dstAddr + i, UNSAFE.getByte(srcAddr + i));
+ }
+ else
+ UNSAFE.copyMemory(srcAddr, dstAddr, len);
+ }
+
+ /**
+ * Copy memory from offheap to heap.
*
- * @param src Source.
- * @param dst Dst.
+ * @param srcAddr Source address.
+ * @param dstBase Destination base.
+ * @param dstOff Destination offset.
* @param len Length.
*/
- public static void copyMemory(long src, long dst, long len) {
- UNSAFE.copyMemory(src, dst, len);
+ public static void copyOffheapHeap(long srcAddr, Object dstBase, long dstOff, long len) {
+ if (len <= PER_BYTE_THRESHOLD) {
+ for (int i = 0; i < len; i++)
+ UNSAFE.putByte(dstBase, dstOff + i, UNSAFE.getByte(srcAddr + i));
+ }
+ else
+ UNSAFE.copyMemory(null, srcAddr, dstBase, dstOff, len);
+ }
+
+ /**
+ * Copy memory from heap to offheap.
+ *
+ * @param srcBase Source base.
+ * @param srcOff Source offset.
+ * @param dstAddr Destination address.
+ * @param len Length.
+ */
+ public static void copyHeapOffheap(Object srcBase, long srcOff, long dstAddr, long len) {
+ if (len <= PER_BYTE_THRESHOLD) {
+ for (int i = 0; i < len; i++)
+ UNSAFE.putByte(dstAddr + i, UNSAFE.getByte(srcBase, srcOff + i));
+ }
+ else
+ UNSAFE.copyMemory(srcBase, srcOff, null, dstAddr, len);
}
/**
@@ -1047,7 +1090,12 @@ public abstract class GridUnsafe {
* @param len Length.
*/
public static void copyMemory(Object srcBase, long srcOff, Object dstBase, long dstOff, long len) {
- UNSAFE.copyMemory(srcBase, srcOff, dstBase, dstOff, len);
+ if (len <= PER_BYTE_THRESHOLD && srcBase != null && dstBase != null) {
+ for (int i = 0; i < len; i++)
+ UNSAFE.putByte(dstBase, dstOff + i, UNSAFE.getByte(srcBase, srcOff + i));
+ }
+ else
+ UNSAFE.copyMemory(srcBase, srcOff, dstBase, dstOff, len);
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 3fa3f7b..e1937bb 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -265,9 +265,6 @@ import static org.apache.ignite.internal.util.GridUnsafe.staticFieldOffset;
*/
@SuppressWarnings({"UnusedReturnValue", "UnnecessaryFullyQualifiedName", "RedundantStringConstructorCall"})
public abstract class IgniteUtils {
- /** {@code True} if {@code unsafe} should be used for array copy. */
- private static final boolean UNSAFE_BYTE_ARR_CP = unsafeByteArrayCopyAvailable();
-
/** Sun-specific JDK constructor factory for objects that don't have empty constructor. */
private static final Method CTOR_FACTORY;
@@ -8482,28 +8479,6 @@ public abstract class IgniteUtils {
}
/**
- * As long as array copying uses JVM-private API, which is not guaranteed
- * to be available on all JVM, this method should be called to ensure
- * logic could work properly.
- *
- * @return {@code True} if unsafe copying can work on the current JVM or
- * {@code false} if it can't.
- */
- @SuppressWarnings("TypeParameterExtendsFinalClass")
- private static boolean unsafeByteArrayCopyAvailable() {
- try {
- Class<? extends Unsafe> unsafeCls = Unsafe.class;
-
- unsafeCls.getMethod("copyMemory", Object.class, long.class, Object.class, long.class, long.class);
-
- return true;
- }
- catch (Exception ignored) {
- return false;
- }
- }
-
- /**
* @param src Buffer to copy from (length included).
* @param off Offset in source buffer.
* @param resBuf Result buffer.
@@ -8514,10 +8489,7 @@ public abstract class IgniteUtils {
public static int arrayCopy(byte[] src, int off, byte[] resBuf, int resOff, int len) {
assert resBuf.length >= resOff + len;
- if (UNSAFE_BYTE_ARR_CP)
- GridUnsafe.copyMemory(src, GridUnsafe.BYTE_ARR_OFF + off, resBuf, GridUnsafe.BYTE_ARR_OFF + resOff, len);
- else
- System.arraycopy(src, off, resBuf, resOff, len);
+ System.arraycopy(src, off, resBuf, resOff, len);
return resOff + len;
}
@@ -9284,7 +9256,7 @@ public abstract class IgniteUtils {
public static byte[] copyMemory(long ptr, int size) {
byte[] res = new byte[size];
- GridUnsafe.copyMemory(null, ptr, res, GridUnsafe.BYTE_ARR_OFF, size);
+ GridUnsafe.copyOffheapHeap(ptr, res, GridUnsafe.BYTE_ARR_OFF, size);
return res;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java
index 2f57e59..759b95e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java
@@ -135,7 +135,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput {
if (maxOff < halfSize) {
byte[] newInBuf = new byte[halfSize]; // Shrink.
- GridUnsafe.copyMemory(inBuf, BYTE_ARR_OFF, newInBuf, BYTE_ARR_OFF, off);
+ System.arraycopy(inBuf, 0, newInBuf, 0, off);
buf = inBuf = newInBuf;
}
@@ -191,7 +191,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput {
byte[] arr = new byte[arrSize];
- GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(arrSize), arr, BYTE_ARR_OFF, arrSize);
+ System.arraycopy(buf, offset(arrSize), arr, 0, arrSize);
return arr;
}
@@ -364,14 +364,14 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput {
fromStream(len);
- GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(len), b, BYTE_ARR_OFF, len);
+ System.arraycopy(buf, offset(len), b, 0, len);
}
/** {@inheritDoc} */
@Override public void readFully(byte[] b, int off, int len) throws IOException {
fromStream(len);
- GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(len), b, BYTE_ARR_OFF + off, len);
+ System.arraycopy(buf, offset(len), b, off, len);
}
/** {@inheritDoc} */
@@ -488,7 +488,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput {
else {
int toRead = Math.min(len, max - this.off);
- GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(toRead), b, BYTE_ARR_OFF + off, toRead);
+ System.arraycopy(buf, offset(toRead), b, off, toRead);
return toRead;
}
@@ -552,7 +552,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput {
else {
// shift and refill buffer manually
if (avail > 0)
- GridUnsafe.copyMemory(utfBuf, BYTE_ARR_OFF + pos, utfBuf, BYTE_ARR_OFF, avail);
+ System.arraycopy(utfBuf, pos, utfBuf, 0, avail);
pos = 0;
end = (int)Math.min(MAX_BLOCK_SIZE, utfLen);
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java
index c0fe0d3..c45b8fd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java
@@ -97,7 +97,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput
@Override public byte[] array() {
byte[] bytes0 = new byte[off];
- GridUnsafe.copyMemory(bytes, BYTE_ARR_OFF, bytes0, BYTE_ARR_OFF, off);
+ System.arraycopy(bytes, 0, bytes0, 0, off);
return bytes0;
}
@@ -130,7 +130,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput
if (size > bytes.length) {
byte[] newBytes = new byte[size << 1]; // Grow.
- GridUnsafe.copyMemory(bytes, BYTE_ARR_OFF, newBytes, BYTE_ARR_OFF, off);
+ System.arraycopy(bytes, 0, newBytes, 0, off);
bytes = newBytes;
}
@@ -140,7 +140,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput
if (maxOff < halfSize) {
byte[] newBytes = new byte[halfSize]; // Shrink.
- GridUnsafe.copyMemory(bytes, BYTE_ARR_OFF, newBytes, BYTE_ARR_OFF, off);
+ System.arraycopy(bytes, 0, newBytes, 0, off);
bytes = newBytes;
}
@@ -165,7 +165,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput
@Override public void write(byte[] b) throws IOException {
requestFreeSize(b.length);
- GridUnsafe.copyMemory(b, BYTE_ARR_OFF, bytes, BYTE_ARR_OFF + off, b.length);
+ System.arraycopy(b, 0, bytes, off, b.length);
onWrite(b.length);
}
@@ -174,7 +174,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput
@Override public void write(byte[] b, int off, int len) throws IOException {
requestFreeSize(len);
- GridUnsafe.copyMemory(b, BYTE_ARR_OFF + off, bytes, BYTE_ARR_OFF + this.off, len);
+ System.arraycopy(b, off, bytes, this.off, len);
onWrite(len);
}
@@ -293,7 +293,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput
requestFreeSize(arr.length);
- GridUnsafe.copyMemory(arr, BYTE_ARR_OFF, bytes, BYTE_ARR_OFF + off, arr.length);
+ System.arraycopy(arr, 0, bytes, off, arr.length);
onWrite(arr.length);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
index 718e1a6..41cb586 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
@@ -607,7 +607,7 @@ public class GridUnsafeMemory {
* @return The same array as passed in one.
*/
public byte[] readBytes(long ptr, byte[] arr) {
- GridUnsafe.copyMemory(null, ptr, arr, GridUnsafe.BYTE_ARR_OFF, arr.length);
+ GridUnsafe.copyOffheapHeap(ptr, arr, GridUnsafe.BYTE_ARR_OFF, arr.length);
return arr;
}
@@ -620,7 +620,7 @@ public class GridUnsafeMemory {
* @return The same array as passed in one.
*/
public byte[] readBytes(long ptr, byte[] arr, int off, int len) {
- GridUnsafe.copyMemory(null, ptr, arr, GridUnsafe.BYTE_ARR_OFF + off, len);
+ GridUnsafe.copyOffheapHeap(ptr, arr, GridUnsafe.BYTE_ARR_OFF + off, len);
return arr;
}
@@ -632,7 +632,7 @@ public class GridUnsafeMemory {
* @param arr Array.
*/
public void writeBytes(long ptr, byte[] arr) {
- GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length);
+ GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length);
}
/**
@@ -644,7 +644,7 @@ public class GridUnsafeMemory {
* @param len Length.
*/
public void writeBytes(long ptr, byte[] arr, int off, int len) {
- GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF + off, null, ptr, len);
+ GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF + off, ptr, len);
}
/**
@@ -655,7 +655,7 @@ public class GridUnsafeMemory {
* @param len Length in bytes.
*/
public void copyMemory(long srcPtr, long destPtr, long len) {
- GridUnsafe.copyMemory(srcPtr, destPtr, len);
+ GridUnsafe.copyOffheapOffheap(srcPtr, destPtr, len);
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java
index 1546252..ca4bdd2 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java
@@ -46,7 +46,7 @@ public class BinaryFieldsOffheapSelfTest extends BinaryFieldsAbstractSelfTest {
ptrs.add(ptr);
- GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length);
+ GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length);
return new BinaryObjectOffheapImpl(binaryContext(marsh), ptr, 0, arr.length);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java
index 796c027..052e652 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java
@@ -46,7 +46,7 @@ public class BinaryFooterOffsetsOffheapSelfTest extends BinaryFooterOffsetsAbstr
ptrs.add(ptr);
- GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length);
+ GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length);
return new BinaryObjectOffheapImpl(ctx, ptr, 0, arr.length);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java
index 39a4d32..70df1e6 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java
@@ -3346,7 +3346,7 @@ public class BinaryMarshallerSelfTest extends GridCommonAbstractTest {
long ptr = GridUnsafe.allocateMemory(arr.length);
- GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length);
+ GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length);
return ptr;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
index 4fc5c6c..b623c62 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java
@@ -791,7 +791,7 @@ public class BinaryObjectBuilderDefaultMappersSelfTest extends GridCommonAbstrac
else
GridUnsafe.putInt(ptr0, len);
- GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr0 + 4, arr.length);
+ GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr0 + 4, arr.length);
BinaryObject offheapObj = (BinaryObject)
((CacheObjectBinaryProcessorImpl)(grid(0)).context().cacheObjects()).unmarshal(ptr, false);
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java
index e5af8f1..025c4da 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java
@@ -311,7 +311,7 @@ public class HadoopShuffleJob<T> implements AutoCloseable {
/** */
@Override public void copyTo(long ptr) {
- GridUnsafe.copyMemory(buf, GridUnsafe.BYTE_ARR_OFF + off, null, ptr, size);
+ GridUnsafe.copyHeapOffheap(buf, GridUnsafe.BYTE_ARR_OFF + off, ptr, size);
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java
index 69dfe64..71a314b 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java
@@ -169,7 +169,7 @@ public class HadoopShuffleMessage implements HadoopMessage {
off += 4;
- GridUnsafe.copyMemory(null, ptr, buf, GridUnsafe.BYTE_ARR_OFF + off, size);
+ GridUnsafe.copyOffheapHeap(ptr, buf, GridUnsafe.BYTE_ARR_OFF + off, size);
off += size;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java
index f7b1a73..bb5acba 100644
--- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java
+++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java
@@ -67,7 +67,7 @@ public class HadoopDataOutStream extends OutputStream implements DataOutput {
/** {@inheritDoc} */
@Override public void write(byte[] b, int off, int len) {
- GridUnsafe.copyMemory(b, GridUnsafe.BYTE_ARR_OFF + off, null, move(len), len);
+ GridUnsafe.copyHeapOffheap(b, GridUnsafe.BYTE_ARR_OFF + off, move(len), len);
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java
index 019b172..7862d6e 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java
@@ -162,7 +162,7 @@ public class HadoopConcurrentHashMultimapSelftest extends HadoopAbstractMapTest
private void read(long ptr, int size, Writable w) {
assert size == 4 : size;
- GridUnsafe.copyMemory(null, ptr, buf, GridUnsafe.BYTE_ARR_OFF, size);
+ GridUnsafe.copyOffheapHeap(ptr, buf, GridUnsafe.BYTE_ARR_OFF, size);
dataInput.bytes(buf, size);
http://git-wip-us.apache.org/repos/asf/ignite/blob/530d8c8d/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java
index d04beca..111ea78 100644
--- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java
+++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java
@@ -202,7 +202,7 @@ public class HadoopSkipListSelfTest extends HadoopAbstractMapTest {
private void read(long ptr, int size, Writable w) {
assert size == 4 : size;
- GridUnsafe.copyMemory(null, ptr, buf, GridUnsafe.BYTE_ARR_OFF, size);
+ GridUnsafe.copyOffheapHeap(ptr, buf, GridUnsafe.BYTE_ARR_OFF, size);
dataInput.bytes(buf, size);