diff options
author | Marc-Andre Laperle | 2014-08-28 03:15:58 +0000 |
---|---|---|
committer | Marc-Andre Laperle | 2014-09-03 03:04:38 +0000 |
commit | 78072af745bb9f33a47c3df7e6f530efcd06e039 (patch) | |
tree | ad735dea68ce75beac7e72280c5bb8c12ecfcb62 /lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf | |
parent | 9ef8264611f587184da79d2d044a7cc6eb4846ae (diff) | |
download | org.eclipse.linuxtools-78072af745bb9f33a47c3df7e6f530efcd06e039.tar.gz org.eclipse.linuxtools-78072af745bb9f33a47c3df7e6f530efcd06e039.tar.xz org.eclipse.linuxtools-78072af745bb9f33a47c3df7e6f530efcd06e039.zip |
ctf: Provide a utility for "safe" mapping of a ByteBuffer
This works around a bug on Windows which prevents deleting a file after it
was mapped. See http://bugs.java.com/view_bug.do?bug_id=4715154
Running TraceSeekBenchmark, I noticed a 10% decreased in performance (3.8s vs 3.4s) on Windows. On Linux, the difference is negligible (2.41s vs 2.40).
Change-Id: Ie590709df4149708a37257ee3bc3d3d017f31c21
Signed-off-by: Marc-Andre Laperle <marc-andre.laperle@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/32448
Tested-by: Hudson CI
Diffstat (limited to 'lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf')
3 files changed, 9 insertions, 7 deletions
diff --git a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInput.java b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInput.java index 157b1049c0..db8c6371c6 100644 --- a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInput.java +++ b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInput.java @@ -14,7 +14,7 @@ package org.eclipse.linuxtools.ctf.core.trace; import java.io.File; import java.io.IOException; -import java.nio.MappedByteBuffer; +import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import java.nio.file.StandardOpenOption; @@ -32,6 +32,7 @@ import org.eclipse.linuxtools.ctf.core.event.types.IntegerDefinition; import org.eclipse.linuxtools.ctf.core.event.types.StringDefinition; import org.eclipse.linuxtools.ctf.core.event.types.StructDeclaration; import org.eclipse.linuxtools.ctf.core.event.types.StructDefinition; +import org.eclipse.linuxtools.internal.ctf.core.SafeMappedByteBuffer; import org.eclipse.linuxtools.internal.ctf.core.event.types.ArrayDefinition; import org.eclipse.linuxtools.internal.ctf.core.trace.StreamInputPacketIndex; import org.eclipse.linuxtools.internal.ctf.core.trace.StreamInputPacketIndexEntry; @@ -289,7 +290,7 @@ public class CTFStreamInput implements IDefinitionScope, AutoCloseable { * Map the packet. */ try (FileChannel fc = FileChannel.open(fFile.toPath(), StandardOpenOption.READ)) { - MappedByteBuffer map = fc.map(MapMode.READ_ONLY, packetOffsetBytes, mapSize); + ByteBuffer map = SafeMappedByteBuffer.map(fc, MapMode.READ_ONLY, packetOffsetBytes, mapSize); if (map == null) { throw new CTFReaderException("Failed to allocate mapped byte buffer"); //$NON-NLS-1$ } diff --git a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInputPacketReader.java b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInputPacketReader.java index 9509a9929d..29ef23f9ff 100644 --- a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInputPacketReader.java +++ b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFStreamInputPacketReader.java @@ -13,7 +13,6 @@ package org.eclipse.linuxtools.ctf.core.trace; import java.io.IOException; import java.nio.ByteBuffer; -import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel.MapMode; import org.eclipse.jdt.annotation.NonNull; @@ -35,6 +34,7 @@ import org.eclipse.linuxtools.ctf.core.event.types.SimpleDatatypeDefinition; import org.eclipse.linuxtools.ctf.core.event.types.StructDeclaration; import org.eclipse.linuxtools.ctf.core.event.types.StructDefinition; import org.eclipse.linuxtools.ctf.core.event.types.VariantDefinition; +import org.eclipse.linuxtools.internal.ctf.core.SafeMappedByteBuffer; import org.eclipse.linuxtools.internal.ctf.core.event.EventDeclaration; import org.eclipse.linuxtools.internal.ctf.core.event.types.composite.EventHeaderDefinition; import org.eclipse.linuxtools.internal.ctf.core.trace.StreamInputPacketIndexEntry; @@ -221,7 +221,7 @@ public class CTFStreamInputPacketReader implements IDefinitionScope, AutoCloseab @NonNull private ByteBuffer getByteBufferAt(long position, long size) throws CTFReaderException, IOException { - MappedByteBuffer map = fStreamInputReader.getFc().map(MapMode.READ_ONLY, position, size); + ByteBuffer map = SafeMappedByteBuffer.map(fStreamInputReader.getFc(), MapMode.READ_ONLY, position, size); if (map == null) { throw new CTFReaderException("Failed to allocate mapped byte buffer"); //$NON-NLS-1$ } diff --git a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTrace.java b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTrace.java index 0c2ee5a5cb..3414110a2c 100644 --- a/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTrace.java +++ b/lttng/org.eclipse.linuxtools.ctf.core/src/org/eclipse/linuxtools/ctf/core/trace/CTFTrace.java @@ -19,8 +19,8 @@ import java.io.FileFilter; import java.io.FileInputStream; import java.io.IOException; import java.io.Serializable; +import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode; import java.util.Arrays; @@ -44,6 +44,7 @@ import org.eclipse.linuxtools.ctf.core.event.types.IDefinition; import org.eclipse.linuxtools.ctf.core.event.types.IntegerDefinition; import org.eclipse.linuxtools.ctf.core.event.types.StructDeclaration; import org.eclipse.linuxtools.ctf.core.event.types.StructDefinition; +import org.eclipse.linuxtools.internal.ctf.core.SafeMappedByteBuffer; import org.eclipse.linuxtools.internal.ctf.core.event.CTFCallsiteComparator; import org.eclipse.linuxtools.internal.ctf.core.event.metadata.exceptions.ParseException; import org.eclipse.linuxtools.internal.ctf.core.event.types.ArrayDefinition; @@ -507,7 +508,7 @@ public class CTFTrace implements IDefinitionScope, AutoCloseable { * if there is a file error */ private CTFStream openStreamInput(File streamFile) throws CTFReaderException { - MappedByteBuffer byteBuffer; + ByteBuffer byteBuffer; BitBuffer streamBitBuffer; CTFStream stream; @@ -519,7 +520,7 @@ public class CTFTrace implements IDefinitionScope, AutoCloseable { try (FileInputStream fis = new FileInputStream(streamFile); FileChannel fc = fis.getChannel()) { /* Map one memory page of 4 kiB */ - byteBuffer = fc.map(MapMode.READ_ONLY, 0, (int) Math.min(fc.size(), 4096L)); + byteBuffer = SafeMappedByteBuffer.map(fc, MapMode.READ_ONLY, 0, (int) Math.min(fc.size(), 4096L)); if (byteBuffer == null) { throw new IllegalStateException("Failed to allocate memory"); //$NON-NLS-1$ } |