diff --git a/artio-codecs/src/main/java/uk/co/real_logic/artio/util/MessageTypeEncoding.java b/artio-codecs/src/main/java/uk/co/real_logic/artio/util/MessageTypeEncoding.java index 744550ced6..7035faae46 100644 --- a/artio-codecs/src/main/java/uk/co/real_logic/artio/util/MessageTypeEncoding.java +++ b/artio-codecs/src/main/java/uk/co/real_logic/artio/util/MessageTypeEncoding.java @@ -15,16 +15,16 @@ */ package uk.co.real_logic.artio.util; +import org.agrona.UnsafeApi; import org.agrona.collections.LongHashSet; import java.util.Set; import static org.agrona.BufferUtil.ARRAY_BASE_OFFSET; -import static org.agrona.UnsafeAccess.UNSAFE; /** * Class for handling the encoding and decoding of Artio's packed message types. - * + *

* FIX uses 1 or 2 character ascii sequences as a way of representing the message type of messages. Some venues * have a longer representation with more message types in. Artio has a packed representation where the bytes of * the message type are encoded into a long. @@ -69,7 +69,7 @@ public static LongHashSet packAllMessageTypes(final Set messageTypes) * Creates a packed message type from a char[] and length. * * @param messageType message type as ascii char[]. - * @param length the number of characters within messageType to use. + * @param length the number of characters within messageType to use. * @return the packed message type. * @throws IllegalArgumentException if messageType parameter is too long. */ @@ -99,8 +99,8 @@ private static void checkLength(final int length) * Creates a packed message type from a byte[] and length. * * @param messageType message type as ascii byte[]. - * @param offset the offset within the messagetype to start looking - * @param length the number of characters within messageType to use. + * @param offset the offset within the messagetype to start looking + * @param length the number of characters within messageType to use. * @return the packed message type. * @throws IllegalArgumentException if messageType parameter is too long. */ @@ -115,18 +115,18 @@ static long packMessageType(final byte[] messageType, final long baseOffset, fin if (length == 1) { - return UNSAFE.getByte(messageType, baseOffset + offset); + return UnsafeApi.getByte(messageType, baseOffset + offset); } else if (length == 2) { - return UNSAFE.getShort(messageType, baseOffset + offset); + return UnsafeApi.getShort(messageType, baseOffset + offset); } else { long packed = 0; for (int index = 0; index < length; index++) { - final int asciiValue = UNSAFE.getByte(messageType, baseOffset + offset + index); + final int asciiValue = UnsafeApi.getByte(messageType, baseOffset + offset + index); packed |= asciiValue << (MESSAGE_TYPE_BITSHIFT * index); } return packed; @@ -141,10 +141,9 @@ else if (length == 2) * type. * * @param packedMessageType the FIX message type in packed format. - * @param dest a destination byte array where the unpacked value is put, should be at least two bytes long. - * @throws ArrayIndexOutOfBoundsException if dest is too short. - * + * @param dest a destination byte array where the unpacked value is put, should be at least two bytes long. * @return the length of the unpacked value + * @throws ArrayIndexOutOfBoundsException if dest is too short. */ public static int unpackMessageType(final long packedMessageType, final byte[] dest) { diff --git a/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayIndex.java b/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayIndex.java index 3eb42d523c..f5b8f13824 100644 --- a/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayIndex.java +++ b/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayIndex.java @@ -31,13 +31,13 @@ import java.io.File; import java.io.IOException; +import java.lang.invoke.VarHandle; import java.util.ArrayList; import java.util.List; import java.util.function.LongFunction; import static io.aeron.archive.status.RecordingPos.NULL_RECORDING_ID; import static io.aeron.logbuffer.FrameDescriptor.*; -import static org.agrona.UnsafeAccess.UNSAFE; import static uk.co.real_logic.artio.dictionary.SessionConstants.SEQUENCE_RESET_MESSAGE_TYPE; import static uk.co.real_logic.artio.engine.SequenceNumberExtractor.NO_SEQUENCE_NUMBER; import static uk.co.real_logic.artio.engine.logger.ReplayIndexDescriptor.*; @@ -579,7 +579,7 @@ void onRecord( final long beginPosition = endPosition - length; beginChangeOrdered(headerBuffer, changePosition); - UNSAFE.storeFence(); + VarHandle.storeStoreFence(); final int segmentIndex = ReplayIndexDescriptor.segmentIndex( beginChangePosition, segmentSizeBitShift, indexFileSize); diff --git a/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayQuery.java b/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayQuery.java index 82446eb580..f3522fd243 100644 --- a/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayQuery.java +++ b/artio-core/src/main/java/uk/co/real_logic/artio/engine/logger/ReplayQuery.java @@ -33,6 +33,7 @@ import uk.co.real_logic.artio.util.CharFormatter; import java.io.File; +import java.lang.invoke.VarHandle; import java.util.ArrayList; import java.util.List; import java.util.function.LongFunction; @@ -40,7 +41,6 @@ import static io.aeron.Aeron.NULL_VALUE; import static io.aeron.CommonContext.IPC_CHANNEL; import static io.aeron.logbuffer.FrameDescriptor.FRAME_ALIGNMENT; -import static org.agrona.UnsafeAccess.UNSAFE; import static uk.co.real_logic.artio.DebugLogger.IS_REPLAY_ATTEMPT_ENABLED; import static uk.co.real_logic.artio.engine.logger.ReplayIndexDescriptor.*; import static uk.co.real_logic.artio.engine.logger.Replayer.MOST_RECENT_MESSAGE; @@ -284,7 +284,7 @@ ReplayOperation query( final long recordingId = indexRecord.recordingId(); final int readLength = indexRecord.length(); - UNSAFE.loadFence(); // LoadLoad required so previous loads don't move past version check below. + VarHandle.loadLoadFence(); // LoadLoad required so previous loads don't move past version check below. if (log) { @@ -475,7 +475,7 @@ public Long2ObjectHashMap queryStartPositions() final long recordingId = indexRecord.recordingId(); final int sequenceNumber = indexRecord.sequenceNumber(); - UNSAFE.loadFence(); // LoadLoad required so previous loads don't move past version check below. + VarHandle.loadLoadFence(); // LoadLoad required so previous loads don't move past version check below. // if the block was read atomically with no updates if (changePosition == beginChangeVolatile(headerBuffer)) diff --git a/artio-system-tests/src/perf/java/uk/co/real_logic/artio/ArraysFillBenchmark.java b/artio-system-tests/src/perf/java/uk/co/real_logic/artio/ArraysFillBenchmark.java index b82af3f3cb..d86e8507c8 100644 --- a/artio-system-tests/src/perf/java/uk/co/real_logic/artio/ArraysFillBenchmark.java +++ b/artio-system-tests/src/perf/java/uk/co/real_logic/artio/ArraysFillBenchmark.java @@ -17,13 +17,12 @@ import org.agrona.BitUtil; import org.agrona.BufferUtil; +import org.agrona.UnsafeApi; import org.openjdk.jmh.annotations.*; import java.util.Arrays; import java.util.concurrent.TimeUnit; -import static org.agrona.UnsafeAccess.UNSAFE; - @State(Scope.Benchmark) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) @@ -59,7 +58,7 @@ public int[] arraysFill() public int[] memset() { final int[] values = this.values; - UNSAFE.setMemory(values, BufferUtil.ARRAY_BASE_OFFSET, sizeInBytes, MISSING_BYTE); + UnsafeApi.setMemory(values, BufferUtil.ARRAY_BASE_OFFSET, sizeInBytes, MISSING_BYTE); return values; } @@ -67,8 +66,8 @@ public int[] memset() public int[] offsetMemset() { final int[] values = this.values; - UNSAFE.putByte(values, BufferUtil.ARRAY_BASE_OFFSET, MISSING_BYTE); - UNSAFE.setMemory(values, BufferUtil.ARRAY_BASE_OFFSET + 1, sizeInBytes - 1, MISSING_BYTE); + UnsafeApi.putByte(values, BufferUtil.ARRAY_BASE_OFFSET, MISSING_BYTE); + UnsafeApi.setMemory(values, BufferUtil.ARRAY_BASE_OFFSET + 1, sizeInBytes - 1, MISSING_BYTE); return values; } diff --git a/build.gradle b/build.gradle index f5d74b4e90..cc42a019a6 100644 --- a/build.gradle +++ b/build.gradle @@ -121,7 +121,7 @@ allprojects { configurations.configureEach { resolutionStrategy { failOnVersionConflict() - force "org.agrona:agrona:${libs.versions.agrona.get()}", + force libs.agrona, libs.byteBuddy, libs.byteBuddy.agent, // patching conflicting Checkstyle dependencies @@ -178,6 +178,7 @@ subprojects { useJUnitPlatform() jvmArgs('--add-opens', 'java.base/sun.nio.ch=ALL-UNNAMED') + jvmArgs('--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED') jvmArgs('--add-opens', 'java.base/java.util.zip=ALL-UNNAMED') if (buildJavaVersion >= 21) { @@ -319,6 +320,7 @@ project(':artio-codecs') { tasks.register('generateMessages', JavaExec) { mainClass.set('uk.co.real_logic.sbe.SbeTool') + jvmArgs('--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED') classpath = configurations.codecGeneration systemProperties('sbe.output.dir': generatedDir, 'sbe.target.language': 'Java', @@ -391,6 +393,7 @@ project(':artio-ilink3-codecs') { tasks.register('generateMessages', JavaExec) { mainClass.set('uk.co.real_logic.sbe.SbeTool') + jvmArgs('--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED') classpath = configurations.codecGeneration systemProperties( 'sbe.output.dir': generatedDir, @@ -472,6 +475,7 @@ project(':artio-binary-entrypoint-codecs') { tasks.register('generateMessages', JavaExec) { mainClass.set('uk.co.real_logic.sbe.SbeTool') + jvmArgs('--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED') classpath = configurations.codecGeneration systemProperties( 'sbe.output.dir': generatedDir, @@ -607,6 +611,7 @@ project(':artio-session-codecs') { tasks.register('generateCodecs', JavaExec) { mainClass.set('uk.co.real_logic.artio.dictionary.CodecGenerationTool') + jvmArgs('--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED') classpath = configurations.codecGeneration def dictionaryFile = 'src/main/resources/session_dictionary.xml' inputs.file(dictionaryFile) @@ -617,6 +622,7 @@ project(':artio-session-codecs') { tasks.register('generateOtherCodecs', JavaExec) { mainClass.set('uk.co.real_logic.artio.dictionary.CodecGenerationTool') + jvmArgs('--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED') classpath = configurations.codecGeneration def dictionaryFile = 'src/main/resources/other_session_dictionary.xml' inputs.file(dictionaryFile) @@ -684,6 +690,7 @@ project(':artio-session-fixt-codecs') { tasks.register('generateCodecs', JavaExec) { mainClass.set('uk.co.real_logic.artio.dictionary.CodecGenerationTool') + jvmArgs('--add-opens', 'java.base/jdk.internal.misc=ALL-UNNAMED') classpath = configurations.codecGeneration systemProperty("fix.codecs.parent_package", "uk.co.real_logic.artio.fixt") args = [generatedDir, 'src/main/resources/FIXT11.xml'] diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4e767eee5a..9dfee5d999 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -aeron = "1.46.8" -agrona = "1.23.1" +aeron = "1.47.0" +agrona = "2.0.1" byteBuddy = "1.15.11" checkstyle = "10.20.1" junit = "5.11.4" @@ -8,10 +8,10 @@ gradle = "8.11.1" jmh = "1.37" [libraries] -agrona = { group = "org.agrona", name = "agrona", version = { strictly = "[1.23.1, 2.0[", require = "1.23.1" } } +agrona = { group = "org.agrona", name = "agrona", version.ref = "agrona" } aeron-client = { group = "io.aeron", name = "aeron-client", version.ref = "aeron" } aeron-archive = { group = "io.aeron", name = "aeron-archive", version.ref = "aeron" } -sbe = { group = "uk.co.real-logic", name = "sbe-tool", version = "1.33.2" } +sbe = { group = "uk.co.real-logic", name = "sbe-tool", version = "1.34.1" } mockito = { group = "org.mockito", name = "mockito-core", version = "5.15.2" } hamcrest = { group = "org.hamcrest", name = "hamcrest", version = "3.0" } junit4 = { group = "junit", name = "junit", version = "4.13.2" }