From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Aikar Date: Fri, 29 May 2020 20:29:02 -0400 Subject: [PATCH] Synchronize PalettedContainer instead of ReentrantLock Mojang has flaws in their logic about chunks being concurrently wrote to. So we constantly see crashes around multiple threads writing. Additionally, java has optimized synchronization so well that its in many times faster than trying to manage read wrote locks for low contention situations. And this is extremely a low contention situation. diff --git a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java index 45a969f97b26e328e34f3d576557999c32b954a2..83dc9550f4ed2a138d4ece2765273e555cda994a 100644 --- a/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java +++ b/src/main/java/net/minecraft/world/level/chunk/PalettedContainer.java @@ -35,11 +35,11 @@ public class PalettedContainer implements PaletteResize { private final ThreadingDetector threadingDetector = new ThreadingDetector("PalettedContainer"); public void acquire() { - this.threadingDetector.checkAndLock(); + // this.threadingDetector.checkAndLock(); // Paper - disable this - use proper synchronization } public void release() { - this.threadingDetector.checkAndUnlock(); + // this.threadingDetector.checkAndUnlock(); // Paper - disable this } // Paper start - Anti-Xray - Add preset values @@ -143,7 +143,7 @@ public class PalettedContainer implements PaletteResize { } // Paper end - public T getAndSet(int x, int y, int z, T value) { + public synchronized T getAndSet(int x, int y, int z, T value) { // Paper - synchronize this.acquire(); Object var5; @@ -166,7 +166,7 @@ public class PalettedContainer implements PaletteResize { return this.data.palette.valueFor(j); } - public void set(int x, int y, int z, T value) { + public synchronized void set(int x, int y, int z, T value) { // Paper - synchronize this.acquire(); try { @@ -200,7 +200,7 @@ public class PalettedContainer implements PaletteResize { }); } - public void read(FriendlyByteBuf buf) { + public synchronized void read(FriendlyByteBuf buf) { // Paper - synchronize this.acquire(); try { @@ -218,7 +218,7 @@ public class PalettedContainer implements PaletteResize { // Paper start - Anti-Xray - Add chunk packet info @Deprecated public void write(FriendlyByteBuf buf) { this.write(buf, null, 0); } // Notice for updates: Please make sure this method isn't used anywhere - public void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo chunkPacketInfo, int bottomBlockY) { + public synchronized void write(FriendlyByteBuf buf, @Nullable com.destroystokyo.paper.antixray.ChunkPacketInfo chunkPacketInfo, int bottomBlockY) { // Paper - synchronize this.acquire(); try { @@ -236,7 +236,7 @@ public class PalettedContainer implements PaletteResize { } - private static DataResult> read(IdMap idList, PalettedContainer.Strategy provider, PalettedContainer.DiscData serialized, T defaultValue, T @org.jetbrains.annotations.Nullable [] presetValues) { // Paper - Anti-Xray - Add preset values + private synchronized static DataResult> read(IdMap idList, PalettedContainer.Strategy provider, PalettedContainer.DiscData serialized, T defaultValue, T @org.jetbrains.annotations.Nullable [] presetValues) { // Paper - Anti-Xray - Add preset values // Paper - synchronize List list = serialized.paletteEntries(); int i = provider.size(); int j = provider.calculateBitsForSerialization(idList, list.size()); @@ -275,7 +275,7 @@ public class PalettedContainer implements PaletteResize { return DataResult.success(new PalettedContainer<>(idList, provider, configuration, bitStorage, list, defaultValue, presetValues)); // Paper - Anti-Xray - Add preset values } - private PalettedContainer.DiscData write(IdMap idList, PalettedContainer.Strategy provider) { + private synchronized PalettedContainer.DiscData write(IdMap idList, PalettedContainer.Strategy provider) { // Paper - synchronize this.acquire(); PalettedContainer.DiscData var12;