diff options
author | Glease <4586901+Glease@users.noreply.github.com> | 2023-02-21 15:05:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-21 08:05:14 +0100 |
commit | a4141b9f20b854f7c0ae3bfe6f4ef886780e9631 (patch) | |
tree | c3c3f9fe8d0124403c01f83abc116c9a5767ad49 /src | |
parent | e9f5d040a25b7e01f34ca4de84fa3bdba03f2352 (diff) | |
download | GT5-Unofficial-a4141b9f20b854f7c0ae3bfe6f4ef886780e9631.tar.gz GT5-Unofficial-a4141b9f20b854f7c0ae3bfe6f4ef886780e9631.tar.bz2 GT5-Unofficial-a4141b9f20b854f7c0ae3bfe6f4ef886780e9631.zip |
Fix possible race condition between client and server thread over config circuit list (#1757)
Signed-off-by: Glease <4586901+Glease@users.noreply.github.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/gregtech/api/GregTech_API.java | 38 |
1 files changed, 16 insertions, 22 deletions
diff --git a/src/main/java/gregtech/api/GregTech_API.java b/src/main/java/gregtech/api/GregTech_API.java index 30f8961d0b..223d967895 100644 --- a/src/main/java/gregtech/api/GregTech_API.java +++ b/src/main/java/gregtech/api/GregTech_API.java @@ -5,17 +5,7 @@ import static gregtech.api.enums.GT_Values.L; import static gregtech.api.enums.GT_Values.M; import static gregtech.api.enums.GT_Values.MOD_ID_IC2; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.TreeMap; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.BiFunction; import java.util.function.IntFunction; @@ -194,7 +184,7 @@ public class GregTech_API { private static final Multimap<Integer, ItemStack> sRealConfigurationList = Multimaps .newListMultimap(new TreeMap<>(), ArrayList::new); - private static final Map<Integer, List<ItemStack>> sConfigurationLists = new HashMap<>(); + private static final Map<Integer, List<ItemStack>> sConfigurationLists = new ConcurrentHashMap<>(); private static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sRealCircuitProgrammerList = new LinkedHashMap<>(); public static final Map<Predicate<ItemStack>, BiFunction<ItemStack, EntityPlayerMP, ItemStack>> sCircuitProgrammerList = Collections .unmodifiableMap(sRealCircuitProgrammerList); @@ -744,8 +734,12 @@ public class GregTech_API { if (GT_Utility.areStacksEqual(tRegistered, aStack)) return; ItemStack stack = GT_Utility.copyAmount(0, aStack); sRealConfigurationList.put(minTier, stack); - sConfigurationLists.entrySet().stream().filter(e -> e.getKey() >= minTier) - .forEach(e -> e.getValue().add(stack)); + for (Map.Entry<Integer, List<ItemStack>> e : sConfigurationLists.entrySet()) { + if (e.getKey() >= minTier) { + e.getValue().add(stack); + e.getValue().sort(getConfigurationCircuitsComparator()); + } + } } /** @@ -757,12 +751,11 @@ public class GregTech_API { */ public static List<ItemStack> getConfigurationCircuitList(int machineTier) { return Collections.unmodifiableList( - sConfigurationLists - .computeIfAbsent( - machineTier, - (t) -> sRealConfigurationList.entries().stream().filter(e -> e.getKey() <= machineTier) - .map(Map.Entry::getValue).collect(Collectors.toList())) - .stream().sorted(getConfigurationCircuitsComparator()).collect(Collectors.toList())); + sConfigurationLists.computeIfAbsent( + machineTier, + (t) -> sRealConfigurationList.entries().stream().filter(e -> e.getKey() <= machineTier) + .map(Map.Entry::getValue).sorted(getConfigurationCircuitsComparator()) + .collect(Collectors.toList()))); } public static Comparator<ItemStack> getConfigurationCircuitsComparator() { @@ -771,8 +764,9 @@ public class GregTech_API { // player is exposed if (GT_Mod.gregtechproxy.mCircuitsOrder.isEmpty()) return is.getItem() instanceof GT_IntegratedCircuit_Item ? 0 : 1; - return GT_Mod.gregtechproxy.mCircuitsOrder - .getOrDefault(GameRegistry.findUniqueIdentifierFor(is.getItem()).toString(), Integer.MAX_VALUE); + return GT_Mod.gregtechproxy.mCircuitsOrder.getOrDefault( + String.valueOf(GameRegistry.findUniqueIdentifierFor(is.getItem())), + Integer.MAX_VALUE); }).thenComparing(ItemStack::getUnlocalizedName).thenComparing(ItemStack::getItemDamage); } |