Don't complete skull lookups on main thread (MC-227435)

This commit is contained in:
Shane Freeder 2021-06-29 17:34:20 +01:00
parent 1d194e5605
commit 333cc2e36f
No known key found for this signature in database
GPG key ID: A3F61EA5A085289C

View file

@ -0,0 +1,97 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Tue, 29 Jun 2021 17:17:34 +0100
Subject: [PATCH] Don't complete skull lookups on main thread (MC-227435)
diff --git a/0001-Don-t-complete-skull-lookups-on-main-thread.patch b/0001-Don-t-complete-skull-lookups-on-main-thread.patch
new file mode 100644
index 0000000000000000000000000000000000000000..602ee10b4328ef0c9e0301445a1dae3486a57e0a
--- /dev/null
+++ b/0001-Don-t-complete-skull-lookups-on-main-thread.patch
@@ -0,0 +1,53 @@
+From 66c09880e3b6a2b3029af424641827a5bd6e4e36 Mon Sep 17 00:00:00 2001
+From: Shane Freeder <theboyetronic@gmail.com>
+Date: Tue, 29 Jun 2021 17:17:34 +0100
+Subject: [PATCH] Don't complete skull lookups on main thread
+
+---
+ .../level/block/entity/SkullBlockEntity.java | 17 ++++++++++++++---
+ 1 file changed, 14 insertions(+), 3 deletions(-)
+
+diff --git a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
+index 172413fc0..59ce41527 100644
+--- a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
++++ b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
+@@ -8,6 +8,8 @@ import com.mojang.authlib.properties.Property;
+ import java.util.UUID;
+ import java.util.function.Consumer;
+ import javax.annotation.Nullable;
++
++import net.minecraft.Util;
+ import net.minecraft.core.BlockPos;
+ import net.minecraft.nbt.CompoundTag;
+ import net.minecraft.nbt.ListTag;
+@@ -145,15 +147,24 @@ public class SkullBlockEntity extends BlockEntity {
+
+ public static void updateGameprofile(@Nullable GameProfile owner, Consumer<GameProfile> callback) {
+ if (owner != null && !StringUtil.isNullOrEmpty(owner.getName()) && (!owner.isComplete() || !owner.getProperties().containsKey("textures")) && SkullBlockEntity.profileCache != null && SkullBlockEntity.sessionService != null) {
+- SkullBlockEntity.profileCache.getAsync(owner.getName(), (gameprofile1) -> {
++ // Paper start
++ SkullBlockEntity.profileCache.getAsync(owner.getName(), (gameprofile) -> {
++ Runnable runnable = () -> {
++ GameProfile gameprofile1 = gameprofile;
+ Property property = (Property) Iterables.getFirst(gameprofile1.getProperties().get("textures"), (Object) null);
+
+ if (property == null) {
+ gameprofile1 = SkullBlockEntity.sessionService.fillProfileProperties(gameprofile1, true);
+ }
+
+- SkullBlockEntity.profileCache.add(gameprofile1);
+- callback.accept(gameprofile1);
++ GameProfile finalGameprofile = gameprofile1;
++ net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> {
++ SkullBlockEntity.profileCache.add(finalGameprofile);
++ callback.accept(finalGameprofile);
++ });
++ };
++ Util.backgroundExecutor().execute(runnable);
++ // paper end
+ });
+ } else {
+ callback.accept(owner);
+--
+2.32.0
+
diff --git a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
index 172413fc0f303d5e15bc2bc55c09ce4faf5298a0..705d5ebb3d7b40745b318617ea39a7ea785b9504 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/SkullBlockEntity.java
@@ -145,15 +145,24 @@ public class SkullBlockEntity extends BlockEntity {
public static void updateGameprofile(@Nullable GameProfile owner, Consumer<GameProfile> callback) {
if (owner != null && !StringUtil.isNullOrEmpty(owner.getName()) && (!owner.isComplete() || !owner.getProperties().containsKey("textures")) && SkullBlockEntity.profileCache != null && SkullBlockEntity.sessionService != null) {
- SkullBlockEntity.profileCache.getAsync(owner.getName(), (gameprofile1) -> {
+ // Paper start
+ SkullBlockEntity.profileCache.getAsync(owner.getName(), (gameprofile) -> {
+ Runnable runnable = () -> {
+ GameProfile gameprofile1 = gameprofile;
Property property = (Property) Iterables.getFirst(gameprofile1.getProperties().get("textures"), (Object) null);
if (property == null) {
gameprofile1 = SkullBlockEntity.sessionService.fillProfileProperties(gameprofile1, true);
}
- SkullBlockEntity.profileCache.add(gameprofile1);
- callback.accept(gameprofile1);
+ GameProfile finalGameprofile = gameprofile1;
+ net.minecraft.server.MinecraftServer.getServer().scheduleOnMain(() -> {
+ SkullBlockEntity.profileCache.add(finalGameprofile);
+ callback.accept(finalGameprofile);
+ });
+ };
+ net.minecraft.Util.backgroundExecutor().execute(runnable);
+ // Paper end
});
} else {
callback.accept(owner);