From c07fd20abd9080f69d88bcb5a82bab92e1d6421d Mon Sep 17 00:00:00 2001 From: Per Minborg Date: Wed, 2 Sep 2020 10:42:10 +0200 Subject: [PATCH] Use Atomic* instead of arrays --- .../chronicle/map/ChronicleMapBuilder.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index 86e060faf..f9cd3744d 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -56,6 +56,8 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import static java.lang.Double.isNaN; import static java.lang.Math.round; @@ -1662,26 +1664,25 @@ public final class ChronicleMapBuilder implements result = openWithExistingFile(canonicalFile, raf, resources, recover, overrideBuilderConfig, corruptionListener); } else { - // Single-element arrays allow to modify variables within lambda - @SuppressWarnings("unchecked") - VanillaChronicleMap[] map = new VanillaChronicleMap[1]; - ByteBuffer[] headerBuffer = new ByteBuffer[1]; - boolean[] newFile = new boolean[1]; - FileChannel fileChannel = raf.getChannel(); + // Atomic* allows lambda modification + final AtomicReference> map = new AtomicReference<>(); + final AtomicReference headerBuffer = new AtomicReference<>(); + final AtomicBoolean newFile = new AtomicBoolean(); + final FileChannel fileChannel = raf.getChannel(); fileLockedIO(canonicalFile, fileChannel, () -> { if (raf.length() == 0) { - map[0] = newMap(); - headerBuffer[0] = writeHeader(fileChannel, map[0]); - newFile[0] = true; + map.set(newMap()); + headerBuffer.set(writeHeader(fileChannel, map.get())); + newFile.set(true); } else { - newFile[0] = false; + newFile.set(false); } }); - if (newFile[0]) { - int headerSize = headerBuffer[0].remaining(); - result = createWithNewFile(map[0], canonicalFile, raf, resources, headerBuffer[0], headerSize); + if (newFile.get()) { + final int headerSize = headerBuffer.get().remaining(); + result = createWithNewFile(map.get(), canonicalFile, raf, resources, headerBuffer.get(), headerSize); } else { result = openWithExistingFile(canonicalFile, raf, resources, recover, overrideBuilderConfig, corruptionListener); }