Improve MT-Safety of UserCache (#2080)
We were missing a synchronize on a get if cached method, however it appears that using a ConcurrentHashMap is a better solution so readers can avoid locking if they just want a cached value. Existing synchronization for writers remains untouched, the ConcurrentHashMap is just so readers can safely read without synchronization
This commit is contained in:
@@ -10,7 +10,7 @@ Additionally, move Saving of the User cache to be done async, incase
|
||||
the user never changed the default setting for Spigot's save on stop only.
|
||||
|
||||
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
index a3c53d9dbf..3b745b2b75 100644
|
||||
index d3d8fffeb0..f142ed9a3b 100644
|
||||
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
||||
@@ -0,0 +0,0 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant<TickTas
|
||||
@@ -23,9 +23,20 @@ index a3c53d9dbf..3b745b2b75 100644
|
||||
// Spigot end
|
||||
}
|
||||
diff --git a/src/main/java/net/minecraft/server/UserCache.java b/src/main/java/net/minecraft/server/UserCache.java
|
||||
index 41be5bf64e..cd8a652eb6 100644
|
||||
index 41be5bf64e..dc5c0afab4 100644
|
||||
--- a/src/main/java/net/minecraft/server/UserCache.java
|
||||
+++ b/src/main/java/net/minecraft/server/UserCache.java
|
||||
@@ -0,0 +0,0 @@ public class UserCache {
|
||||
|
||||
public static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
|
||||
private static boolean c;
|
||||
- private final Map<String, UserCache.UserCacheEntry> d = Maps.newHashMap();
|
||||
- private final Map<UUID, UserCache.UserCacheEntry> e = Maps.newHashMap();
|
||||
+ private final Map<String, UserCache.UserCacheEntry> d = new java.util.concurrent.ConcurrentHashMap<>(); // Paper
|
||||
+ private final Map<UUID, UserCache.UserCacheEntry> e = new java.util.concurrent.ConcurrentHashMap<>(); // Paper
|
||||
private final Deque<GameProfile> f = new java.util.concurrent.LinkedBlockingDeque<GameProfile>(); // CraftBukkit
|
||||
private final GameProfileRepository g;
|
||||
protected final Gson b;
|
||||
@@ -0,0 +0,0 @@ public class UserCache {
|
||||
this.a(gameprofile, (Date) null);
|
||||
}
|
||||
@@ -61,11 +72,8 @@ index 41be5bf64e..cd8a652eb6 100644
|
||||
|
||||
+ @Nullable public GameProfile getProfile(UUID uuid) { return a(uuid); } // Paper - OBFHELPER
|
||||
@Nullable
|
||||
- public GameProfile a(UUID uuid) {
|
||||
+ public synchronized GameProfile a(UUID uuid) { // Paper - synchronize
|
||||
public GameProfile a(UUID uuid) {
|
||||
UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.e.get(uuid);
|
||||
|
||||
return usercache_usercacheentry == null ? null : usercache_usercacheentry.a();
|
||||
@@ -0,0 +0,0 @@ public class UserCache {
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user