From a8c1c732829e13c6f60844af04b3274ae7f04f5c Mon Sep 17 00:00:00 2001 From: themode Date: Sun, 22 Nov 2020 17:40:57 +0100 Subject: [PATCH] Use of a synchronized wrapper for InstanceContainer chunks map --- .../server/instance/InstanceContainer.java | 37 +++++++------------ 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index ae816699f..0641cb261 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -1,6 +1,7 @@ package net.minestom.server.instance; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import net.minestom.server.MinecraftServer; import net.minestom.server.data.Data; @@ -57,7 +58,7 @@ public class InstanceContainer extends Instance { // the chunk generator used, can be null private ChunkGenerator chunkGenerator; // (chunk index -> chunk) map, contains all the chunks in the instance - private final Long2ObjectMap chunks = new Long2ObjectOpenHashMap<>(); + private final Long2ObjectMap chunks = Long2ObjectMaps.synchronize(new Long2ObjectOpenHashMap<>()); // contains all the chunks to remove during the next instance tick protected final Set scheduledChunksToRemove = new HashSet<>(); @@ -451,10 +452,8 @@ public class InstanceContainer extends Instance { @Override public Chunk getChunk(int chunkX, int chunkZ) { final long index = ChunkUtils.getChunkIndex(chunkX, chunkZ); - synchronized (chunks) { - final Chunk chunk = chunks.get(index); - return ChunkUtils.isLoaded(chunk) ? chunk : null; - } + final Chunk chunk = chunks.get(index); + return ChunkUtils.isLoaded(chunk) ? chunk : null; } /** @@ -495,10 +494,8 @@ public class InstanceContainer extends Instance { @Override public void saveChunksToStorage(@Nullable Runnable callback) { - synchronized (chunks) { - Collection chunksCollection = chunks.values(); - this.chunkLoader.saveChunks(chunksCollection, callback); - } + Collection chunksCollection = chunks.values(); + this.chunkLoader.saveChunks(chunksCollection, callback); } @Override @@ -645,16 +642,14 @@ public class InstanceContainer extends Instance { copiedInstance.srcInstance = this; copiedInstance.lastBlockChangeTime = lastBlockChangeTime; - synchronized (chunks) { - for (Chunk chunk : chunks.values()) { - final int chunkX = chunk.getChunkX(); - final int chunkZ = chunk.getChunkZ(); + for (Chunk chunk : chunks.values()) { + final int chunkX = chunk.getChunkX(); + final int chunkZ = chunk.getChunkZ(); - final Chunk copiedChunk = chunk.copy(chunkX, chunkZ); + final Chunk copiedChunk = chunk.copy(chunkX, chunkZ); - copiedInstance.cacheChunk(copiedChunk); - UPDATE_MANAGER.signalChunkLoad(copiedInstance, chunkX, chunkZ); - } + copiedInstance.cacheChunk(copiedChunk); + UPDATE_MANAGER.signalChunkLoad(copiedInstance, chunkX, chunkZ); } return copiedInstance; @@ -701,9 +696,7 @@ public class InstanceContainer extends Instance { */ public void cacheChunk(@NotNull Chunk chunk) { final long index = ChunkUtils.getChunkIndex(chunk.getChunkX(), chunk.getChunkZ()); - synchronized (chunks) { - this.chunks.put(index, chunk); - } + this.chunks.put(index, chunk); } @Override @@ -833,9 +826,7 @@ public class InstanceContainer extends Instance { }); // Clear cache - synchronized (chunks) { - this.chunks.remove(index); - } + this.chunks.remove(index); synchronized (chunkEntities) { this.chunkEntities.remove(index); }