ea0ec8c5a0
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: e9ce88b9 SPIGOT-6562: Add more specific sculk sensor event CraftBukkit Changes: d7ef1e91 SPIGOT-6558: Attempt to improve SkullMeta e7a63287 SPIGOT-6562: Add more specific sculk sensor event
69 lines
3.5 KiB
Diff
69 lines
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 WeightedList
|
|
|
|
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 893c37cc7e33f4baa98131afca45a258600ddc75..09998d160a6d79fdb5a5041a5d572649a1532e6a 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 d4c9def80154c3e62a0b6928057062a0808f339f..4fa64b1e2004810906bb0b174436c8e687a75ada 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 java.util.stream.Stream;
|
|
public class ShufflingList<U> {
|
|
protected final List<ShufflingList.WeightedEntry<U>> entries;
|
|
private final Random random = new Random();
|
|
+ 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() {
|