diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteArrayDataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteArrayDataAccess.java old mode 100644 new mode 100755 index a6e2ec5e6..31adc5a5b --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteArrayDataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteArrayDataAccess.java @@ -43,7 +43,7 @@ public class ByteArrayDataAccess extends AbstractData implements DataAcc } private void initTransients() { - bs = HeapBytesStore.uninitialized(); + bs = null; } @Override @@ -77,14 +77,14 @@ public class ByteArrayDataAccess extends AbstractData implements DataAcc @Override public Data getData(@NotNull byte[] instance) { array = instance; - bs.init(instance); + bs = HeapBytesStore.wrap(array); return this; } @Override public void uninit() { array = null; - bs.uninit(); + bs = null; } @Override diff --git a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteBufferDataAccess.java b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteBufferDataAccess.java old mode 100644 new mode 100755 index 9cc02c8f4..51d21e84f --- a/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteBufferDataAccess.java +++ b/src/main/java/net/openhft/chronicle/hash/serialization/impl/ByteBufferDataAccess.java @@ -32,7 +32,6 @@ public class ByteBufferDataAccess extends AbstractData implements DataAccess { // Cache fields - private transient HeapBytesStore heapBytesStore; private transient NativeBytesStore nativeBytesStore; private transient VanillaBytes bytes; @@ -45,7 +44,6 @@ public class ByteBufferDataAccess extends AbstractData } private void initTransients() { - heapBytesStore = HeapBytesStore.uninitialized(); nativeBytesStore = NativeBytesStore.uninitialized(); bytes = VanillaBytes.vanillaBytes(); } @@ -91,8 +89,7 @@ public class ByteBufferDataAccess extends AbstractData nativeBytesStore.init(instance, false); bytesStore = nativeBytesStore; } else { - heapBytesStore.init(instance); - bytesStore = heapBytesStore; + bytesStore = HeapBytesStore.wrap(instance); } return this; } @@ -102,8 +99,6 @@ public class ByteBufferDataAccess extends AbstractData bb = null; if (bytesStore == nativeBytesStore) { nativeBytesStore.uninit(); - } else { - heapBytesStore.uninit(); } } diff --git a/src/main/java/net/openhft/chronicle/map/impl/stage/data/ZeroBytesStore.java b/src/main/java/net/openhft/chronicle/map/impl/stage/data/ZeroBytesStore.java index 24f9276f3..4ad8acccb 100755 --- a/src/main/java/net/openhft/chronicle/map/impl/stage/data/ZeroBytesStore.java +++ b/src/main/java/net/openhft/chronicle/map/impl/stage/data/ZeroBytesStore.java @@ -29,7 +29,12 @@ public enum ZeroBytesStore implements BytesStore { @Override public long addressForWrite(long offset) throws UnsupportedOperationException, BufferOverflowException { - throw new UnsupportedOperationException("todo"); + throw new UnsupportedOperationException("Cannot get the address of nothing"); + } + + @Override + public long addressForWritePosition() throws UnsupportedOperationException, BufferOverflowException { + throw new UnsupportedOperationException("Cannot get the address of nothing"); } @Override diff --git a/src/test/java/net/openhft/chronicle/map/MemoryLeaksTest.java b/src/test/java/net/openhft/chronicle/map/MemoryLeaksTest.java old mode 100644 new mode 100755 index b4e34abb9..9699a67ff --- a/src/test/java/net/openhft/chronicle/map/MemoryLeaksTest.java +++ b/src/test/java/net/openhft/chronicle/map/MemoryLeaksTest.java @@ -41,6 +41,7 @@ import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; @RunWith(Parameterized.class) +@Ignore("Long running") public class MemoryLeaksTest { /** @@ -61,7 +62,7 @@ public class MemoryLeaksTest { this.closeWithinContext = closeWithinContext; builder = ChronicleMap .of(IntValue.class, String.class).constantKeySizeBySample(Values.newHeapInstance(IntValue.class)) - .valueReaderAndDataAccess(new CountedStringReader(), new StringUtf8DataAccess()); + .valueReaderAndDataAccess(new CountedStringReader(this), new StringUtf8DataAccess()); if (replicated) builder.replication((byte) 1); builder.entries(1).averageValueSize(10); @@ -220,15 +221,16 @@ public class MemoryLeaksTest { } } - private class CountedStringReader extends StringSizedReader { - + private static class CountedStringReader extends StringSizedReader { + private transient MemoryLeaksTest memoryLeaksTest; private final String creationStackTrace; private final Cleaner cleaner; - CountedStringReader() { - serializerCount.incrementAndGet(); - serializers.add(new WeakReference<>(this)); - cleaner = CleanerUtils.createCleaner(this, serializerCount::decrementAndGet); + CountedStringReader(MemoryLeaksTest memoryLeaksTest) { + this.memoryLeaksTest = memoryLeaksTest; + this.memoryLeaksTest.serializerCount.incrementAndGet(); + this.memoryLeaksTest.serializers.add(new WeakReference<>(this)); + cleaner = CleanerUtils.createCleaner(this, this.memoryLeaksTest.serializerCount::decrementAndGet); try (StringWriter stringWriter = new StringWriter(); PrintWriter printWriter = new PrintWriter(stringWriter)) { new Exception().printStackTrace(printWriter); @@ -237,11 +239,12 @@ public class MemoryLeaksTest { } catch (IOException e) { throw new RuntimeException(e); } + this.memoryLeaksTest = memoryLeaksTest; } @Override public CountedStringReader copy() { - return new CountedStringReader(); + return new CountedStringReader(this.memoryLeaksTest); } } }