14c974629c
More appropriately aligns ourself with the no team option, because the collideRule team is only a team because it has to be, not because we want anyone to have any sort of gameplay based relationship. Also block any options from being set on this team to further enforce that it is not a persistent team and should not be treated as such.
100 lines
3.7 KiB
Diff
100 lines
3.7 KiB
Diff
From a6d4f7801444aaf0bb3fb0f32d1290163721369f Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Mon, 16 May 2016 20:47:41 -0400
|
|
Subject: [PATCH] Optimize UserCache / Thread Safe
|
|
|
|
Because Techable keeps complaining about how this isn't thread safe,
|
|
easier to do this than replace the entire thing.
|
|
|
|
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 6fbe9e6..8ca8fbf 100644
|
|
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
|
|
@@ -508,7 +508,7 @@ public abstract class MinecraftServer implements Runnable, ICommandListener, IAs
|
|
// Spigot start
|
|
if (org.spigotmc.SpigotConfig.saveUserCacheOnStopOnly) {
|
|
LOGGER.info("Saving usercache.json");
|
|
- this.X.c();
|
|
+ this.X.c(false); // Paper
|
|
}
|
|
// Spigot end
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/UserCache.java b/src/main/java/net/minecraft/server/UserCache.java
|
|
index ccfc755..989758c 100644
|
|
--- a/src/main/java/net/minecraft/server/UserCache.java
|
|
+++ b/src/main/java/net/minecraft/server/UserCache.java
|
|
@@ -108,7 +108,7 @@ public class UserCache {
|
|
this.a(gameprofile, (Date) null);
|
|
}
|
|
|
|
- private void a(GameProfile gameprofile, Date date) {
|
|
+ private synchronized void a(GameProfile gameprofile, Date date) { // Paper - synchronize
|
|
UUID uuid = gameprofile.getId();
|
|
|
|
if (date == null) {
|
|
@@ -122,8 +122,9 @@ public class UserCache {
|
|
String s = gameprofile.getName().toLowerCase(Locale.ROOT);
|
|
UserCache.UserCacheEntry usercache_usercacheentry = new UserCache.UserCacheEntry(gameprofile, date, null);
|
|
|
|
- if (this.e.containsKey(uuid)) {
|
|
+ //if (this.e.containsKey(uuid)) { // Paper
|
|
UserCache.UserCacheEntry usercache_usercacheentry1 = (UserCache.UserCacheEntry) this.e.get(uuid);
|
|
+ if (usercache_usercacheentry1 != null) { // Paper
|
|
|
|
this.d.remove(usercache_usercacheentry1.a().getName().toLowerCase(Locale.ROOT));
|
|
this.f.remove(gameprofile);
|
|
@@ -136,7 +137,7 @@ public class UserCache {
|
|
}
|
|
|
|
@Nullable
|
|
- public GameProfile getProfile(String s) {
|
|
+ public synchronized GameProfile getProfile(String s) { // Paper - synchronize
|
|
String s1 = s.toLowerCase(Locale.ROOT);
|
|
UserCache.UserCacheEntry usercache_usercacheentry = (UserCache.UserCacheEntry) this.d.get(s1);
|
|
|
|
@@ -165,7 +166,7 @@ public class UserCache {
|
|
return usercache_usercacheentry == null ? null : usercache_usercacheentry.a();
|
|
}
|
|
|
|
- public String[] a() {
|
|
+ public synchronized String[] a() { // Paper - synchronize
|
|
ArrayList arraylist = Lists.newArrayList(this.d.keySet());
|
|
|
|
return (String[]) arraylist.toArray(new String[arraylist.size()]);
|
|
@@ -227,8 +228,15 @@ public class UserCache {
|
|
|
|
}
|
|
|
|
+ // Paper start
|
|
public void c() {
|
|
+ c(true);
|
|
+ }
|
|
+ public void c(boolean asyncSave) {
|
|
+ // Paper end
|
|
String s = this.b.toJson(this.a(org.spigotmc.SpigotConfig.userCacheCap));
|
|
+ Runnable save = () -> {
|
|
+
|
|
BufferedWriter bufferedwriter = null;
|
|
|
|
try {
|
|
@@ -242,6 +250,14 @@ public class UserCache {
|
|
} finally {
|
|
IOUtils.closeQuietly(bufferedwriter);
|
|
}
|
|
+ // Paper start
|
|
+ };
|
|
+ if (asyncSave) {
|
|
+ MCUtil.scheduleAsyncTask(save);
|
|
+ } else {
|
|
+ save.run();
|
|
+ }
|
|
+ // Paper end
|
|
|
|
}
|
|
|
|
--
|
|
2.10.0.windows.1
|
|
|