ef0e5a642d
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 9ae3f10f SPIGOT-3842: Add Player#fireworkBoost() and expand Firework API 48c0c547 PR-786: Add methods to get sounds from entities CraftBukkit Changes: 5cc9c022a SPIGOT-7152: Handle hand item changing during air interact event 4ffa1acf6 SPIGOT-7154: Players get kicked when interacting with a conversation 4daa21123 SPIGOT-3842: Add Player#fireworkBoost() and expand Firework API e5d6a9bbf PR-1100: Add methods to get sounds from entities b7e9f1c8b SPIGOT-7146: Reduce use of Material switch in ItemMeta Spigot Changes: 4c157bb4 Rebuild patches
70 Zeilen
3.5 KiB
Diff
70 Zeilen
3.5 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Aikar <aikar@aikar.co>
|
|
Date: Mon, 6 Jul 2020 18:36:41 -0400
|
|
Subject: [PATCH] Fix Concurrency issue in ShufflingList
|
|
|
|
if multiple threads from worldgen sort at same time, it will crash.
|
|
So make a copy of the list for sorting purposes.
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/GateBehavior.java b/src/main/java/net/minecraft/world/entity/ai/behavior/GateBehavior.java
|
|
index c1f22c5e17418f91736237af1495a8a9910a61d5..5a5d454b5987bb01d03f91c15b7a6bff46f1de71 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/GateBehavior.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/GateBehavior.java
|
|
@@ -16,7 +16,7 @@ public class GateBehavior<E extends LivingEntity> extends Behavior<E> {
|
|
private final Set<MemoryModuleType<?>> exitErasedMemories;
|
|
private final GateBehavior.OrderPolicy orderPolicy;
|
|
private final GateBehavior.RunningPolicy runningPolicy;
|
|
- private final ShufflingList<Behavior<? super E>> behaviors = new ShufflingList<>();
|
|
+ private final ShufflingList<Behavior<? super E>> behaviors = new ShufflingList<>(false); // Paper - don't use a clone
|
|
|
|
public GateBehavior(Map<MemoryModuleType<?>, MemoryStatus> requiredMemoryState, Set<MemoryModuleType<?>> memoriesToForgetWhenStopped, GateBehavior.OrderPolicy order, GateBehavior.RunningPolicy runMode, List<Pair<Behavior<? super E>, Integer>> tasks) {
|
|
super(requiredMemoryState);
|
|
diff --git a/src/main/java/net/minecraft/world/entity/ai/behavior/ShufflingList.java b/src/main/java/net/minecraft/world/entity/ai/behavior/ShufflingList.java
|
|
index 2af08836c60ddf0e1df7c53316eae6e329b5747f..090bba46b6ecd7d0e1415feb678b9b23264fe5e9 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/ai/behavior/ShufflingList.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/ai/behavior/ShufflingList.java
|
|
@@ -14,12 +14,25 @@ import net.minecraft.util.RandomSource;
|
|
public class ShufflingList<U> {
|
|
protected final List<ShufflingList.WeightedEntry<U>> entries;
|
|
private final RandomSource random = RandomSource.create();
|
|
+ private final boolean isUnsafe; // Paper
|
|
|
|
public ShufflingList() {
|
|
+ // Paper start
|
|
+ this(true);
|
|
+ }
|
|
+ public ShufflingList(boolean isUnsafe) {
|
|
+ this.isUnsafe = isUnsafe;
|
|
+ // Paper end
|
|
this.entries = Lists.newArrayList();
|
|
}
|
|
|
|
private ShufflingList(List<ShufflingList.WeightedEntry<U>> list) {
|
|
+ // Paper start
|
|
+ this(list, true);
|
|
+ }
|
|
+ private ShufflingList(List<ShufflingList.WeightedEntry<U>> list, boolean isUnsafe) {
|
|
+ this.isUnsafe = isUnsafe;
|
|
+ // Paper end
|
|
this.entries = Lists.newArrayList(list);
|
|
}
|
|
|
|
@@ -35,11 +48,12 @@ public class ShufflingList<U> {
|
|
}
|
|
|
|
public ShufflingList<U> shuffle() {
|
|
- this.entries.forEach((entry) -> {
|
|
- entry.setRandom(this.random.nextFloat());
|
|
- });
|
|
- this.entries.sort(Comparator.comparingDouble(ShufflingList.WeightedEntry::getRandWeight));
|
|
- return this;
|
|
+ // Paper start - make concurrent safe, work off a clone of the list
|
|
+ List<ShufflingList.WeightedEntry<U>> list = this.isUnsafe ? Lists.newArrayList(this.entries) : this.entries;
|
|
+ list.forEach(entry -> entry.setRandom(this.random.nextFloat()));
|
|
+ list.sort(Comparator.comparingDouble(ShufflingList.WeightedEntry::getRandWeight));
|
|
+ return this.isUnsafe ? new ShufflingList<>(list, this.isUnsafe) : this;
|
|
+ // Paper end
|
|
}
|
|
|
|
public Stream<U> stream() {
|