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 2015/11/16 13:14:55 UTC
[2/2] ignite git commit: IGNITE-1917: Added methods for unsafe writes.
IGNITE-1917: Added methods for unsafe writes.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1b48b585
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1b48b585
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1b48b585
Branch: refs/heads/ignite-1917
Commit: 1b48b58571bb745d7ce95d7395d85ad553206f58
Parents: 3f19b51
Author: vozerov-gridgain <vo...@gridgain.com>
Authored: Mon Nov 16 15:09:55 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Mon Nov 16 15:09:55 2015 +0300
----------------------------------------------------------------------
.../streams/PortableAbstractOutputStream.java | 47 ++++++----
.../streams/PortableHeapOutputStream.java | 35 ++++++-
.../streams/PortableOffheapOutputStream.java | 39 +++++++-
.../portable/streams/PortableOutputStream.java | 99 ++++++++++++++++++++
.../PlatformBigEndianOutputStreamImpl.java | 20 ++++
.../memory/PlatformOutputStreamImpl.java | 61 ++++++++++++
6 files changed, 277 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/1b48b585/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
index c943682..8feaf35 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableAbstractOutputStream.java
@@ -123,14 +123,14 @@ public abstract class PortableAbstractOutputStream extends PortableAbstractStrea
@Override public void writeShort(int pos, short val) {
ensureCapacity(pos + 2);
- writeShortPositioned(pos, val);
+ unsafeWriteShort(pos, val);
}
/** {@inheritDoc} */
@Override public void writeInt(int pos, int val) {
ensureCapacity(pos + 4);
- writeIntPositioned(pos, val);
+ unsafeWriteInt(pos, val);
}
/** {@inheritDoc} */
@@ -247,6 +247,33 @@ public abstract class PortableAbstractOutputStream extends PortableAbstractStrea
return 0;
}
+ /** {@inheritDoc} */
+ @Override public int unsafeStart(int cap) {
+ ensureCapacity(pos + cap);
+
+ return pos;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeStop(int pos) {
+ position(pos);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteBoolean(int pos, boolean val) {
+ unsafeWriteByte(pos, val ? BYTE_ONE : BYTE_ZERO);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteFloat(int pos, float val) {
+ unsafeWriteInt(pos, Float.floatToIntBits(val));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteDouble(int pos, double val) {
+ unsafeWriteLong(pos, Double.doubleToLongBits(val));
+ }
+
/**
* Calculate new capacity.
*
@@ -314,22 +341,6 @@ public abstract class PortableAbstractOutputStream extends PortableAbstractStrea
protected abstract void writeLongFast(long val);
/**
- * Write short value to the given position.
- *
- * @param pos Position.
- * @param val Value.
- */
- protected abstract void writeShortPositioned(int pos, short val);
-
- /**
- * Write int value to the given position.
- *
- * @param pos Position.
- * @param val Value.
- */
- protected abstract void writeIntPositioned(int pos, int val);
-
- /**
* Ensure capacity.
*
* @param cnt Required byte count.
http://git-wip-us.apache.org/repos/asf/ignite/blob/1b48b585/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapOutputStream.java
index 51d6c85..f45a637 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableHeapOutputStream.java
@@ -114,7 +114,12 @@ public final class PortableHeapOutputStream extends PortableAbstractOutputStream
}
/** {@inheritDoc} */
- @Override protected void writeShortPositioned(int pos, short val) {
+ @Override public void unsafeWriteByte(int pos, byte val) {
+ UNSAFE.putByte(data, BYTE_ARR_OFF + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteShort(int pos, short val) {
if (!LITTLE_ENDIAN)
val = Short.reverseBytes(val);
@@ -122,10 +127,36 @@ public final class PortableHeapOutputStream extends PortableAbstractOutputStream
}
/** {@inheritDoc} */
- @Override protected void writeIntPositioned(int pos, int val) {
+ @Override public void unsafeWriteChar(int pos, char val) {
+ if (!LITTLE_ENDIAN)
+ val = Character.reverseBytes(val);
+
+ UNSAFE.putChar(data, BYTE_ARR_OFF + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteInt(int pos, int val) {
if (!LITTLE_ENDIAN)
val = Integer.reverseBytes(val);
UNSAFE.putInt(data, BYTE_ARR_OFF + pos, val);
}
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteLong(int pos, long val) {
+ if (!LITTLE_ENDIAN)
+ val = Long.reverseBytes(val);
+
+ UNSAFE.putLong(data, BYTE_ARR_OFF + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWrite(int pos, byte[] arr, int off, int cnt) {
+ UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, data, BYTE_ARR_OFF + pos, cnt);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWrite(int pos, long addr, int cnt) {
+ UNSAFE.copyMemory(null, addr, data, BYTE_ARR_OFF + pos, cnt);
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/1b48b585/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapOutputStream.java
index 430a176..59acfcd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOffheapOutputStream.java
@@ -125,7 +125,17 @@ public class PortableOffheapOutputStream extends PortableAbstractOutputStream {
}
/** {@inheritDoc} */
- @Override protected void writeShortPositioned(int pos, short val) {
+ @Override public boolean hasArray() {
+ return false;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteByte(int pos, byte val) {
+ UNSAFE.putByte(ptr + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteShort(int pos, short val) {
if (!LITTLE_ENDIAN)
val = Short.reverseBytes(val);
@@ -133,7 +143,15 @@ public class PortableOffheapOutputStream extends PortableAbstractOutputStream {
}
/** {@inheritDoc} */
- @Override protected void writeIntPositioned(int pos, int val) {
+ @Override public void unsafeWriteChar(int pos, char val) {
+ if (!LITTLE_ENDIAN)
+ val = Character.reverseBytes(val);
+
+ UNSAFE.putChar(ptr + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteInt(int pos, int val) {
if (!LITTLE_ENDIAN)
val = Integer.reverseBytes(val);
@@ -141,8 +159,21 @@ public class PortableOffheapOutputStream extends PortableAbstractOutputStream {
}
/** {@inheritDoc} */
- @Override public boolean hasArray() {
- return false;
+ @Override public void unsafeWriteLong(int pos, long val) {
+ if (!LITTLE_ENDIAN)
+ val = Long.reverseBytes(val);
+
+ UNSAFE.putLong(ptr + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWrite(int pos, byte[] arr, int off, int cnt) {
+ UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, null, ptr + pos, cnt);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWrite(int pos, long addr, int cnt) {
+ UNSAFE.copyMemory(null, addr, null, ptr + pos, cnt);
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/1b48b585/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
index 0e25b12..ccccfa6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/portable/streams/PortableOutputStream.java
@@ -170,4 +170,103 @@ public interface PortableOutputStream extends PortableStream, AutoCloseable {
* Close the stream releasing resources.
*/
@Override public void close();
+
+ /**
+ * Start write in unsafe mode. Ensures there is enough data to write at least the given amount of bytes.
+ *
+ * @param cap Capacity.
+ * @return Start position.
+ */
+ public int unsafeStart(int cap);
+
+ /**
+ * Finish write in unsafe mode. Essentially it just shifts position to the given location. But this method is
+ * more convenient because allows for easy error detection when paired with {@link #unsafeStart(int)}.
+ *
+ * @param pos Final absolute position.
+ */
+ public void unsafeStop(int pos);
+
+ /**
+ * Write byte in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteByte(int pos, byte val);
+
+ /**
+ * Write boolean in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteBoolean(int pos, boolean val);
+
+ /**
+ * Write short in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteShort(int pos, short val);
+
+ /**
+ * Write char in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteChar(int pos, char val);
+
+ /**
+ * Write int in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteInt(int pos, int val);
+
+ /**
+ * Write long in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteLong(int pos, long val);
+
+ /**
+ * Write float in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteFloat(int pos, float val);
+
+ /**
+ * Write double in unsafe mode.
+ *
+ * @param pos Position.
+ * @param val Value.
+ */
+ public void unsafeWriteDouble(int pos, double val);
+
+ /**
+ * Write array in unsafe mode.
+ *
+ * @param pos Position.
+ * @param arr Value.
+ * @param off Offset.
+ * @param cnt Amount of bytes to write.
+ */
+ public void unsafeWrite(int pos, byte[] arr, int off, int cnt);
+
+ /**
+ * Write raw memory in unsafe mode.
+ *
+ * @param pos Position.
+ * @param addr Address.
+ * @param cnt Amount of bytes to write.
+ */
+ public void unsafeWrite(int pos, long addr, int cnt);
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/1b48b585/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianOutputStreamImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianOutputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianOutputStreamImpl.java
index e5fd71b..3f8e85a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianOutputStreamImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformBigEndianOutputStreamImpl.java
@@ -163,4 +163,24 @@ public class PlatformBigEndianOutputStreamImpl extends PlatformOutputStreamImpl
shift(cnt);
}
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteShort(int pos, short val) {
+ UNSAFE.putShort(data + pos, Short.reverseBytes(val));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteChar(int pos, char val) {
+ UNSAFE.putChar(data + pos, Character.reverseBytes(val));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteInt(int pos, int val) {
+ UNSAFE.putInt(data + pos, Integer.reverseBytes(val));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteLong(int pos, long val) {
+ UNSAFE.putLong(data + pos, val, Long.reverseBytes(val));
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/1b48b585/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 16b1567..70e1dd9 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
@@ -223,6 +223,67 @@ public class PlatformOutputStreamImpl implements PlatformOutputStream {
}
/** {@inheritDoc} */
+ @Override public int unsafeStart(int cap) {
+ ensureCapacity(pos + cap);
+
+ return pos;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeStop(int pos) {
+ position(pos);
+ }
+
+ @Override public void unsafeWriteByte(int pos, byte val) {
+ UNSAFE.putByte(data + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteBoolean(int pos, boolean val) {
+ unsafeWriteByte(pos, val ? (byte)1 : (byte)0);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteShort(int pos, short val) {
+ UNSAFE.putShort(data + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteChar(int pos, char val) {
+ UNSAFE.putChar(data + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteInt(int pos, int val) {
+ UNSAFE.putInt(data + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteLong(int pos, long val) {
+ UNSAFE.putLong(data + pos, val);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteFloat(int pos, float val) {
+ unsafeWriteInt(pos, Float.floatToIntBits(val));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWriteDouble(int pos, double val) {
+ unsafeWriteLong(pos, Double.doubleToLongBits(val));
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWrite(int pos, byte[] arr, int off, int cnt) {
+ UNSAFE.copyMemory(arr, BYTE_ARR_OFF + off, null, data + pos, cnt);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void unsafeWrite(int pos, long addr, int cnt) {
+ UNSAFE.copyMemory(null, addr, null, data + pos, cnt);
+ }
+
+ /** {@inheritDoc} */
@Override public void synchronize() {
PlatformMemoryUtils.length(mem.pointer(), pos);
}