From 05cc09ff510525eb5d5e52551a700944240d1109 Mon Sep 17 00:00:00 2001 From: Sotr Date: Thu, 2 Aug 2018 01:00:34 +0800 Subject: [PATCH] Threadsafe EntityTracker w/ cleanup --- .../src/main/java/net/minecraft/server/EntityTracker.java | 6 +++++- .../main/java/net/minecraft/server/EntityTrackerEntry.java | 2 +- .../src/main/java/net/minecraft/server/PlayerChunkMap.java | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/sources/src/main/java/net/minecraft/server/EntityTracker.java b/sources/src/main/java/net/minecraft/server/EntityTracker.java index 6e4501355..273e6ceab 100644 --- a/sources/src/main/java/net/minecraft/server/EntityTracker.java +++ b/sources/src/main/java/net/minecraft/server/EntityTracker.java @@ -7,6 +7,9 @@ import com.googlecode.concurentlocks.ReentrantReadWriteUpdateLock; import java.util.ArrayList; import java.util.Iterator; import java.util.Set; + +import javax.annotation.concurrent.ThreadSafe; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -14,6 +17,7 @@ import org.apache.logging.log4j.Logger; * Akarin Changes Note * 1) Made collections and entry access thread-safe (safety issue) */ +@ThreadSafe // Akarin public class EntityTracker { private static final Logger a = LogManager.getLogger(); @@ -21,7 +25,7 @@ public class EntityTracker { private final Set c = Sets.newHashSet(); public final ReentrantReadWriteUpdateLock entriesLock = new ReentrantReadWriteUpdateLock(); // Akarin - add lock public final IntHashMap trackedEntities = new IntHashMap(); - private int e; + private volatile int e; // Akarin - volatile public EntityTracker(WorldServer worldserver) { this.world = worldserver; diff --git a/sources/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/sources/src/main/java/net/minecraft/server/EntityTrackerEntry.java index 5e946cfca..b286babfc 100644 --- a/sources/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/sources/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -22,7 +22,7 @@ public class EntityTrackerEntry { private static final Logger c = LogManager.getLogger(); private final Entity tracker; private final int e; - private volatile int f; // Akarin + private volatile int f; // Akarin - volatile private final int g; private long xLoc; private long yLoc; diff --git a/sources/src/main/java/net/minecraft/server/PlayerChunkMap.java b/sources/src/main/java/net/minecraft/server/PlayerChunkMap.java index d0001b133..fdeb2585c 100644 --- a/sources/src/main/java/net/minecraft/server/PlayerChunkMap.java +++ b/sources/src/main/java/net/minecraft/server/PlayerChunkMap.java @@ -503,12 +503,12 @@ public class PlayerChunkMap { } public synchronized void a(PlayerChunk playerchunk) { // Akarin - synchronized - org.spigotmc.AsyncCatcher.catchOp("Async Player Chunk Add"); // Paper // Akarin + // org.spigotmc.AsyncCatcher.catchOp("Async Player Chunk Add"); // Paper // Akarin this.f.add(playerchunk); } public synchronized void b(PlayerChunk playerchunk) { // Akarin - synchronized - // org.spigotmc.AsyncCatcher.catchOp("Async Player Chunk Remove"); // Paper // Akarin + org.spigotmc.AsyncCatcher.catchOp("Async Player Chunk Remove"); // Paper ChunkCoordIntPair chunkcoordintpair = playerchunk.a(); long i = d(chunkcoordintpair.x, chunkcoordintpair.z);