Use a ThreadLocal SimpleDateFormat for CriterionProgress deserialization

This commit is contained in:
jmp
2020-12-09 22:17:23 -08:00
parent 4e6e1ffb09
commit 38efb4d865

View File

@@ -16,6 +16,40 @@ index eaa1063ff2..a3b89a4f2a 100644
public void a(EntityPlayer entityplayer) {
this.player = entityplayer;
}
diff --git a/src/main/java/net/minecraft/server/CriterionProgress.java b/src/main/java/net/minecraft/server/CriterionProgress.java
index 98c3884f47..244b58a7c4 100644
--- a/src/main/java/net/minecraft/server/CriterionProgress.java
+++ b/src/main/java/net/minecraft/server/CriterionProgress.java
@@ -10,8 +10,9 @@ import java.util.Date;
public class CriterionProgress {
- private static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
- private Date b;
+ private static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); // Paper - diff on change
+ private static final ThreadLocal<SimpleDateFormat> THREAD_LOCAL_FORMATTER = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z")); // Paper - async advancements - SimpleDateFormat is not thread safe
+ private Date b; private void setDate(Date date) { this.b = date; } // Paper - OBFHELPER
public CriterionProgress() {}
@@ -44,7 +45,7 @@ public class CriterionProgress {
}
public JsonElement e() {
- return (JsonElement) (this.b != null ? new JsonPrimitive(CriterionProgress.a.format(this.b)) : JsonNull.INSTANCE);
+ return this.getDate() != null ? new JsonPrimitive(THREAD_LOCAL_FORMATTER.get().format(this.getDate())) : JsonNull.INSTANCE; // Paper
}
public static CriterionProgress b(PacketDataSerializer packetdataserializer) {
@@ -61,7 +62,7 @@ public class CriterionProgress {
CriterionProgress criterionprogress = new CriterionProgress();
try {
- criterionprogress.b = CriterionProgress.a.parse(s);
+ criterionprogress.setDate(THREAD_LOCAL_FORMATTER.get().parse(s)); // Paper
return criterionprogress;
} catch (ParseException parseexception) {
throw new JsonSyntaxException("Invalid datetime: " + s, parseexception);
diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java
index 50ea875a3b..cc6a54e06a 100644
--- a/src/main/java/net/minecraft/server/EntityPlayer.java
@@ -89,7 +123,7 @@ index fd75444cec..95d93cd8e5 100644
return this.convertable.getWorldFolder(savedfile);
}
diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java
index 7b385eb43e..3f634a266f 100644
index 7b385eb43e..eae19141e3 100644
--- a/src/main/java/net/minecraft/server/PlayerList.java
+++ b/src/main/java/net/minecraft/server/PlayerList.java
@@ -1339,9 +1339,26 @@ public abstract class PlayerList {
@@ -108,7 +142,7 @@ index 7b385eb43e..3f634a266f 100644
+ final File file1 = new File(file, uuid + ".json");
+ return java.util.concurrent.CompletableFuture.supplyAsync(
+ () -> new AdvancementDataPlayer(this.server.getDataFixer(), this, this.server.getAdvancementData(), file1, entityPlayer),
+ server.executorService
+ this.server.executorService
+ );
+ }
+ // Paper end