Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-12-15 19:10:09 +01:00
34 Zeilen
2.1 KiB
Diff
34 Zeilen
2.1 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
|
|
Date: Mon, 15 May 2023 00:20:59 -0700
|
|
Subject: [PATCH] Fix concurrenct access to lookups field in RegistryOps
|
|
|
|
The concurrent access occurs on the Netty IO threads when
|
|
serializing packets. Thus, it seems it was an oversight of
|
|
the implementator of this function as there are typically
|
|
more than one Netty IO thread.
|
|
|
|
Fixes https://github.com/PaperMC/Folia/issues/11
|
|
|
|
diff --git a/src/main/java/net/minecraft/resources/RegistryOps.java b/src/main/java/net/minecraft/resources/RegistryOps.java
|
|
index 7709eeac907c4895a264cec0a3d453aa8b194c18..c7cfc3ca58f9439142fe5828117f6d576d7df10e 100644
|
|
--- a/src/main/java/net/minecraft/resources/RegistryOps.java
|
|
+++ b/src/main/java/net/minecraft/resources/RegistryOps.java
|
|
@@ -19,11 +19,14 @@ public class RegistryOps<T> extends DelegatingOps<T> {
|
|
|
|
private static RegistryOps.RegistryInfoLookup memoizeLookup(final RegistryOps.RegistryInfoLookup registryInfoGetter) {
|
|
return new RegistryOps.RegistryInfoLookup() {
|
|
- private final Map<ResourceKey<? extends Registry<?>>, Optional<? extends RegistryOps.RegistryInfo<?>>> lookups = new HashMap<>();
|
|
+ // The concurrent access occurs on the Netty IO threads when serializing packets.
|
|
+ // Thus, it seems it was an oversight of the implementator of this function as there
|
|
+ // are typically more than one Netty IO thread.
|
|
+ private final Map<ResourceKey<? extends Registry<?>>, Optional<? extends RegistryOps.RegistryInfo<?>>> lookups = new java.util.concurrent.ConcurrentHashMap<>(); // Paper - fix concurrent access to lookups field
|
|
|
|
@Override
|
|
public <T> Optional<RegistryOps.RegistryInfo<T>> lookup(ResourceKey<? extends Registry<? extends T>> registryRef) {
|
|
- return this.lookups.computeIfAbsent(registryRef, registryInfoGetter::lookup);
|
|
+ return (Optional<RegistryOps.RegistryInfo<T>>)this.lookups.computeIfAbsent(registryRef, registryInfoGetter::lookup); // Paper - fix concurrent access to lookups field
|
|
}
|
|
};
|
|
}
|