From 38efb4d8659bf82c3fb7645cbdf8fd254e5b33b0 Mon Sep 17 00:00:00 2001 From: jmp Date: Wed, 9 Dec 2020 22:17:23 -0800 Subject: [PATCH] Use a ThreadLocal SimpleDateFormat for CriterionProgress deserialization --- ...152-PaperPR-Apply-advancements-async.patch | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/patches/server/0152-PaperPR-Apply-advancements-async.patch b/patches/server/0152-PaperPR-Apply-advancements-async.patch index 726fc9102..acfa01340 100644 --- a/patches/server/0152-PaperPR-Apply-advancements-async.patch +++ b/patches/server/0152-PaperPR-Apply-advancements-async.patch @@ -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 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