diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index e6bfaf185..d4ee4f938 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -749,6 +749,7 @@ public final class ChronicleMapBuilder implements double valueSize = averageValueSize(); size += averageSizeStoringLength(valueBuilder, valueSize); int alignment = valueAlignment(); + size = alignAddr((long) Math.ceil(size), alignment); // so the value starts aligned int worstAlignment; if (worstAlignmentComputationRequiresValueSize(alignment)) { long constantSizeBeforeAlignment = toLong(size); @@ -924,6 +925,8 @@ public final class ChronicleMapBuilder implements throw new IllegalArgumentException("Alignment should be a power of 2, " + alignment + " given"); } + if (Jvm.isArm() && alignment < 8) + return this; this.alignment = alignment; return this; } 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 old mode 100644 new mode 100755 index f8bb08c22..24f9276f3 --- 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 @@ -22,7 +22,6 @@ import net.openhft.chronicle.core.OS; import org.jetbrains.annotations.Nullable; import java.nio.BufferOverflowException; -import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; public enum ZeroBytesStore implements BytesStore { @@ -39,22 +38,22 @@ public enum ZeroBytesStore implements BytesStore { } @Override - public byte readVolatileByte(long offset) throws BufferUnderflowException { + public byte readVolatileByte(long offset) { return 0; } @Override - public short readVolatileShort(long offset) throws BufferUnderflowException { + public short readVolatileShort(long offset) { return 0; } @Override - public int readVolatileInt(long offset) throws BufferUnderflowException { + public int readVolatileInt(long offset) { return 0; } @Override - public long readVolatileLong(long offset) throws BufferUnderflowException { + public long readVolatileLong(long offset) { return 0; } @@ -127,22 +126,31 @@ public enum ZeroBytesStore implements BytesStore { } @Override - public long addressForRead(long offset) throws UnsupportedOperationException { + public long addressForRead(long offset) { return offset; } @Override - public boolean compareAndSwapInt(long offset, int expected, int value) - throws BufferOverflowException, IllegalArgumentException { - throw new UnsupportedOperationException(); + public boolean compareAndSwapInt(long offset, int expected, int value) { + if (expected != 0 || value != 0) + throw new UnsupportedOperationException(); + return true; } @Override - public boolean compareAndSwapLong(long offset, long expected, long value) - throws BufferOverflowException, IllegalArgumentException { - throw new UnsupportedOperationException(); + public void testAndSetInt(long offset, int expected, int value) { + if (expected != 0 || value != 0) + throw new UnsupportedOperationException(); } + @Override + public boolean compareAndSwapLong(long offset, long expected, long value) { + if (expected != 0 || value != 0) + throw new UnsupportedOperationException(); + return true; + } + + @Override public void reserve() throws IllegalStateException { } diff --git a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java index 42dee31e3..a6069b702 100755 --- a/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/ChronicleMapTest.java @@ -618,7 +618,7 @@ public class ChronicleMapTest { .entries((long) entries) .minSegments(1) .averageKeySize(10) - .entryAndValueOffsetAlignment(4) + .entryAndValueOffsetAlignment(8) .create()) { LongValue value4 = Values.newNativeReference(LongValue.class); LongValue value22 = Values.newNativeReference(LongValue.class); @@ -650,9 +650,9 @@ public class ChronicleMapTest { try (ChronicleMap map1 = ChronicleMapBuilder.of(CharSequence.class, LongValue.class) .entries((long) entries) - .minSegments(1) +// .minSegments(1) .averageKeySize(10) - .entryAndValueOffsetAlignment(1) +// .entryAndValueOffsetAlignment(8) .create()) { LongValue value1 = Values.newNativeReference(LongValue.class); LongValue value21 = Values.newNativeReference(LongValue.class); diff --git a/src/test/java/net/openhft/chronicle/map/DemoChronicleMapTest.java b/src/test/java/net/openhft/chronicle/map/DemoChronicleMapTest.java index a925cbd32..4f4d624ae 100755 --- a/src/test/java/net/openhft/chronicle/map/DemoChronicleMapTest.java +++ b/src/test/java/net/openhft/chronicle/map/DemoChronicleMapTest.java @@ -16,6 +16,7 @@ package net.openhft.chronicle.map; +import net.openhft.chronicle.core.Jvm; import net.openhft.chronicle.core.values.IntValue; import net.openhft.chronicle.values.MaxUtf8Length; import net.openhft.chronicle.values.Values; @@ -28,6 +29,7 @@ import java.util.Map; import static net.openhft.chronicle.values.Values.newNativeReference; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assume.assumeFalse; interface DemoOrderVOInterface { public CharSequence getSymbol(); @@ -47,6 +49,7 @@ public class DemoChronicleMapTest { @Test public void testMap() throws IOException { + assumeFalse(Jvm.isArm()); File file = File.createTempFile("DummyOrders" + System.currentTimeMillis(), ".test"); file.deleteOnExit(); int maxEntries = 1000; @@ -55,6 +58,7 @@ public class DemoChronicleMapTest { .putReturnsNull(true) .removeReturnsNull(true) .entries(maxEntries) + .entryAndValueOffsetAlignment(8) .createPersistedTo(file)) { IntValue key = Values.newHeapInstance(IntValue.class); @@ -89,6 +93,7 @@ public class DemoChronicleMapTest { @Test public void testMapLocked() throws IOException { + assumeFalse(Jvm.isArm()); File file = File.createTempFile("DummyOrders-" + System.currentTimeMillis(), ".test"); file.deleteOnExit(); int maxEntries = 1000; @@ -97,6 +102,7 @@ public class DemoChronicleMapTest { .putReturnsNull(true) .removeReturnsNull(true) .entries(maxEntries) + .entryAndValueOffsetAlignment(8) .createPersistedTo(file)) { IntValue key = Values.newHeapInstance(IntValue.class); diff --git a/src/test/java/net/openhft/chronicle/map/RecoverTest.java b/src/test/java/net/openhft/chronicle/map/RecoverTest.java index abf39dece..974c4aa4a 100644 --- a/src/test/java/net/openhft/chronicle/map/RecoverTest.java +++ b/src/test/java/net/openhft/chronicle/map/RecoverTest.java @@ -16,6 +16,7 @@ package net.openhft.chronicle.map; +import net.openhft.chronicle.core.Jvm; import net.openhft.chronicle.core.values.LongValue; import net.openhft.chronicle.hash.ChecksumEntry; import net.openhft.chronicle.hash.ChronicleHashBuilderPrivateAPI; @@ -39,6 +40,7 @@ import java.util.concurrent.atomic.AtomicInteger; import static net.openhft.chronicle.map.ChronicleMapTest.getPersistenceFile; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; public class RecoverTest { @@ -125,6 +127,7 @@ public class RecoverTest { @Test public void testCorruptedEntryRecovery() throws IOException { + assumeFalse(Jvm.isArm()); File file = getPersistenceFile(); try (ChronicleMap map = ChronicleMap .of(Integer.class, LongValue.class) diff --git a/src/test/java/net/openhft/chronicle/map/fromdocs/ChecksumEntryTest.java b/src/test/java/net/openhft/chronicle/map/fromdocs/ChecksumEntryTest.java index f3114dd8e..0997a99e2 100644 --- a/src/test/java/net/openhft/chronicle/map/fromdocs/ChecksumEntryTest.java +++ b/src/test/java/net/openhft/chronicle/map/fromdocs/ChecksumEntryTest.java @@ -16,6 +16,7 @@ package net.openhft.chronicle.map.fromdocs; +import net.openhft.chronicle.core.Jvm; import net.openhft.chronicle.core.values.LongValue; import net.openhft.chronicle.hash.ChecksumEntry; import net.openhft.chronicle.map.ChronicleMap; @@ -29,10 +30,13 @@ import org.junit.Test; import java.io.File; import java.io.IOException; +import static org.junit.Assume.assumeFalse; + public class ChecksumEntryTest { @Test public void testChecksumEntriesWithValueInterface() throws IOException { + assumeFalse(Jvm.isArm()); File file = Builder.getPersistenceFile(); try (ChronicleMap map = ChronicleMap diff --git a/src/test/java/net/openhft/chronicle/map/fromdocs/OpenJDKAndHashMapExamplesTest.java b/src/test/java/net/openhft/chronicle/map/fromdocs/OpenJDKAndHashMapExamplesTest.java index f75c32b35..0b575f590 100644 --- a/src/test/java/net/openhft/chronicle/map/fromdocs/OpenJDKAndHashMapExamplesTest.java +++ b/src/test/java/net/openhft/chronicle/map/fromdocs/OpenJDKAndHashMapExamplesTest.java @@ -22,6 +22,7 @@ import net.openhft.chronicle.map.ExternalMapQueryContext; import net.openhft.chronicle.values.Values; import org.junit.Test; +import java.io.Closeable; import java.io.File; import java.io.IOException; import java.text.ParseException; @@ -98,8 +99,7 @@ public class OpenJDKAndHashMapExamplesTest { BondVOInterface bond = Values.newNativeReference(BondVOInterface.class); // lookup the key and give me a reference I can update in a thread safe way. - try (net.openhft.chronicle.core.io.Closeable c = - chm.acquireContext("369604103", bond)) { + try (Closeable c = chm.acquireContext("369604103", bond)) { // found a key and bond has been set // get directly without touching the rest of the record. long _matDate = bond.getMaturityDate();