From bec5b2a3c5eabc43f8e8acf501313f3982cba964 Mon Sep 17 00:00:00 2001 From: Rob Austin Date: Sun, 1 Feb 2015 22:19:41 +0000 Subject: [PATCH] introduced NativeBytesI to allow us to checks if the buffer has been closed, if the buffer is accessed after it is closed an exception is thrown, This class should be used to investigate JVM crashes, it should not be used in production code ( as its slow ) --- .../chronicle/map/MultiMapFactory.java | 10 +++---- .../chronicle/map/ReplicatedChronicleMap.java | 14 +++++----- .../chronicle/map/VanillaChronicleMap.java | 28 ++++++++++--------- 3 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/MultiMapFactory.java b/src/main/java/net/openhft/chronicle/map/MultiMapFactory.java index ca137ab23..1a615bd24 100644 --- a/src/main/java/net/openhft/chronicle/map/MultiMapFactory.java +++ b/src/main/java/net/openhft/chronicle/map/MultiMapFactory.java @@ -21,7 +21,7 @@ package net.openhft.chronicle.map; import net.openhft.lang.Maths; import net.openhft.lang.collection.ATSDirectBitSet; import net.openhft.lang.io.DirectStore; -import net.openhft.lang.io.NativeBytes; +import net.openhft.lang.io.NativeBytesI; import static net.openhft.lang.Maths.isPowerOf2; import static net.openhft.lang.MemoryUnit.*; @@ -39,7 +39,7 @@ enum MultiMapFactory { } @Override - public MultiMap create(NativeBytes bytes, NativeBytes bitSetBytes) { + public MultiMap create(NativeBytesI bytes, NativeBytesI bitSetBytes) { return new ShortShortMultiMap(bytes, bitSetBytes); } }, @@ -50,7 +50,7 @@ enum MultiMapFactory { } @Override - public MultiMap create(NativeBytes bytes, NativeBytes bitSetBytes) { + public MultiMap create(NativeBytesI bytes, NativeBytesI bitSetBytes) { return new Int24Int24MultiMap(bytes, bitSetBytes); } }, @@ -61,7 +61,7 @@ enum MultiMapFactory { } @Override - public MultiMap create(NativeBytes bytes, NativeBytes bitSetBytes) { + public MultiMap create(NativeBytesI bytes, NativeBytesI bitSetBytes) { return new IntIntMultiMap(bytes, bitSetBytes); } }; @@ -104,5 +104,5 @@ enum MultiMapFactory { public abstract long sizeInBytes(long minCapacity); - public abstract MultiMap create(NativeBytes bytes, NativeBytes bitSetBytes); + public abstract MultiMap create(NativeBytesI bytes, NativeBytesI bitSetBytes); } diff --git a/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java b/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java index d57cdb644..28c67936d 100644 --- a/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/ReplicatedChronicleMap.java @@ -30,7 +30,7 @@ import net.openhft.lang.Maths; import net.openhft.lang.collection.ATSDirectBitSet; import net.openhft.lang.io.Bytes; import net.openhft.lang.io.MultiStoreBytes; -import net.openhft.lang.io.NativeBytes; +import net.openhft.lang.io.NativeBytesI; import net.openhft.lang.threadlocal.ThreadLocalCopies; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -126,7 +126,7 @@ final class ReplicatedChronicleMap.Segment createSegment( - NativeBytes segmentHeader, NativeBytes bytes, int index) { + NativeBytesI segmentHeader, NativeBytesI bytes, int index) { return new Segment(segmentHeader, bytes, index); } @@ -678,7 +678,7 @@ final class ReplicatedChronicleMap.Segment { - Segment(NativeBytes segmentHeader, NativeBytes bytes, int index) { + Segment(NativeBytesI segmentHeader, NativeBytesI bytes, int index) { super(segmentHeader, bytes, index); } @@ -993,7 +993,7 @@ final class ReplicatedChronicleMap, } final long createMappedStoreAndSegments(BytesStore bytesStore) throws IOException { - this.ms = bytesStore; + // checks the the store has not been closed + // todo remove the CheckedBytesStore before the release + this.ms = new CheckedBytesStore(bytesStore); onHeaderCreated(); @@ -242,9 +244,9 @@ class VanillaChronicleMap, long segmentSize = segmentSize(); long headerOffset = 0; for (int i = 0; i < this.segments.length; i++) { - NativeBytes segmentHeader = - (NativeBytes) segmentHeaders.bytes(headerOffset, segmentHeaderSize); - NativeBytes segmentData = (NativeBytes) ms.bytes(offset, segmentSize); + NativeBytesI segmentHeader = + (NativeBytesI) segmentHeaders.bytes(headerOffset, segmentHeaderSize); + NativeBytesI segmentData = (NativeBytesI) ms.bytes(offset, segmentSize); this.segments[i] = createSegment(segmentHeader, segmentData, i); headerOffset += segmentHeaderSize; offset += segmentSize; @@ -306,7 +308,7 @@ class VanillaChronicleMap, return segmentHeaderSize; } - Segment createSegment(NativeBytes segmentHeader, NativeBytes bytes, int index) { + Segment createSegment(NativeBytesI segmentHeader, NativeBytesI bytes, int index) { return new Segment(segmentHeader, bytes, index); } @@ -1411,8 +1413,8 @@ class VanillaChronicleMap, */ static final long LOCK_OFFSET = 0L; // 64-bit static final long SIZE_OFFSET = LOCK_OFFSET + 8L; // 32-bit - final NativeBytes segmentHeader; - final NativeBytes bytes; + final NativeBytesI segmentHeader; + final NativeBytesI bytes; final long entriesOffset; private final int index; private final SingleThreadedDirectBitSet freeList; @@ -1426,7 +1428,7 @@ class VanillaChronicleMap, /** * @param index the index of this segment held by the map */ - Segment(NativeBytes segmentHeader, NativeBytes bytes, int index) { + Segment(NativeBytesI segmentHeader, NativeBytesI bytes, int index) { this.segmentHeader = segmentHeader; this.bytes = bytes; this.index = index; @@ -1435,7 +1437,7 @@ class VanillaChronicleMap, hashLookup = createMultiMap(start); start += CACHE_LINES.align(sizeOfMultiMap() + sizeOfMultiMapBitSet(), BYTES) * multiMapsPerSegment(); - final NativeBytes bsBytes = new NativeBytes(ms.objectSerializer(), + final NativeBytesI bsBytes = new NativeBytes(ms.objectSerializer(), start, start + MultiMapFactory.sizeOfBitSetInBytes(actualChunksPerSegment), null); @@ -1453,11 +1455,11 @@ class VanillaChronicleMap, } private MultiMap createMultiMap(long start) { - final NativeBytes multiMapBytes = + final NativeBytesI multiMapBytes = new NativeBytes((ObjectSerializer) null, start, start = start + sizeOfMultiMap(), null); - final NativeBytes sizeOfMultiMapBitSetBytes = + final NativeBytesI sizeOfMultiMapBitSetBytes = new NativeBytes((ObjectSerializer) null, start, start + sizeOfMultiMapBitSet(), null); // multiMapBytes.load(); @@ -2574,7 +2576,7 @@ class VanillaChronicleMap, // of returnedEntry.getKey(), but it seems rather wasteful to workaround so rare // case. final long offset = segment.offsetFromPos(pos); - final NativeBytes entry = segment.reuse(this.entry, offset); + final NativeBytesI entry = segment.reuse(this.entry, offset); final long keySize = keySizeMarshaller.readSize(entry); long position = entry.position(); @@ -2583,7 +2585,7 @@ class VanillaChronicleMap, removePresent(segment, pos, entry, keySize, segmentHash, true); } - final void removePresent(Segment segment, long pos, NativeBytes entry, long keySize, + final void removePresent(Segment segment, long pos, NativeBytesI entry, long keySize, long segmentHash, boolean removeFromMultiMap) { entry.skip(keySize); segment.manageReplicationBytes(entry, true, true);