geforkt von Mirrors/Paper
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.
Dieser Commit ist enthalten in:
Ursprung
c2be5a5354
Commit
1d8508b7ac
@ -0,0 +1,11 @@
|
|||||||
|
--- a/net/minecraft/world/entity/ai/behavior/GateBehavior.java
|
||||||
|
+++ b/net/minecraft/world/entity/ai/behavior/GateBehavior.java
|
||||||
|
@@ -18,7 +18,7 @@
|
||||||
|
private final Set<MemoryModuleType<?>> exitErasedMemories;
|
||||||
|
private final GateBehavior.OrderPolicy orderPolicy;
|
||||||
|
private final GateBehavior.RunningPolicy runningPolicy;
|
||||||
|
- private final ShufflingList<BehaviorControl<? super E>> behaviors = new ShufflingList<>();
|
||||||
|
+ private final ShufflingList<BehaviorControl<? super E>> behaviors = new ShufflingList<>(false); // Paper - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
private Behavior.Status status = Behavior.Status.STOPPED;
|
||||||
|
|
||||||
|
public GateBehavior(
|
@ -0,0 +1,44 @@
|
|||||||
|
--- a/net/minecraft/world/entity/ai/behavior/ShufflingList.java
|
||||||
|
+++ b/net/minecraft/world/entity/ai/behavior/ShufflingList.java
|
||||||
|
@@ -16,12 +16,25 @@
|
||||||
|
public class ShufflingList<U> implements Iterable<U> {
|
||||||
|
protected final List<ShufflingList.WeightedEntry<U>> entries;
|
||||||
|
private final RandomSource random = RandomSource.create();
|
||||||
|
+ private final boolean isUnsafe; // Paper - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
|
||||||
|
public ShufflingList() {
|
||||||
|
+ // Paper start - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
+ this(true);
|
||||||
|
+ }
|
||||||
|
+ public ShufflingList(boolean isUnsafe) {
|
||||||
|
+ this.isUnsafe = isUnsafe;
|
||||||
|
+ // Paper end - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
this.entries = Lists.newArrayList();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ShufflingList(List<ShufflingList.WeightedEntry<U>> list) {
|
||||||
|
+ // Paper start - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
+ this(list, true);
|
||||||
|
+ }
|
||||||
|
+ private ShufflingList(List<ShufflingList.WeightedEntry<U>> list, boolean isUnsafe) {
|
||||||
|
+ this.isUnsafe = isUnsafe;
|
||||||
|
+ // Paper end - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
this.entries = Lists.newArrayList(list);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -35,9 +48,12 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
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 - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
+ 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 - Fix Concurrency issue in ShufflingList during worldgen
|
||||||
|
}
|
||||||
|
|
||||||
|
public Stream<U> stream() {
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren