From 18cec4f88d8e84bf257050f519367ced07e87215 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 22 Jul 2023 09:56:25 -0400 Subject: [PATCH 1/3] Fix NPE from config fixers Related: #174 --- .../java/org/embeddedt/modernfix/forge/config/ConfigFixer.java | 3 ++- .../org/embeddedt/modernfix/forge/config/NightConfigFixer.java | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/config/ConfigFixer.java b/forge/src/main/java/org/embeddedt/modernfix/forge/config/ConfigFixer.java index 2af232b4..ecd00a5d 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/config/ConfigFixer.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/config/ConfigFixer.java @@ -50,7 +50,8 @@ public class ConfigFixer { this.actualHandler.accept(modConfigEvent); } } else { - ModernFix.LOGGER.warn("Unable to sync on a {} config object", modConfigEvent.getConfig().getConfigData().getClass().getName()); + if(modConfigEvent.getConfig().getConfigData() != null) + ModernFix.LOGGER.warn("Unable to sync on a {} config object", modConfigEvent.getConfig().getConfigData().getClass().getName()); this.actualHandler.accept(modConfigEvent); } } diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java b/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java index 5fb11574..a6993a07 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java @@ -85,6 +85,8 @@ public class NightConfigFixer { private static final Set> UNKNOWN_FILE_CONFIG_CLASSES = Collections.synchronizedSet(new ReferenceOpenHashSet<>()); public static Object toWriteSyncConfig(Object config) { + if(config == null) + return null; try { if(WRITE_SYNC_CONFIG.isAssignableFrom(config.getClass())) { return config; From 373a10f12c4c74768e57f8cad433a9cd0c48720f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 22 Jul 2023 11:06:11 -0400 Subject: [PATCH 2/3] Fix crash with dynamic resources if mods depend on themselves --- .../forge/dynresources/ModelBakeEventHelper.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java index 0e81d4ae..ffe4cc87 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/dynresources/ModelBakeEventHelper.java @@ -17,10 +17,7 @@ import net.minecraftforge.registries.ForgeRegistries; import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; import org.jetbrains.annotations.Nullable; -import java.util.HashSet; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; /** * Stores a list of all known default block/item models in the game, and provides a namespaced version @@ -54,7 +51,9 @@ public class ModelBakeEventHelper { Optional mContainer = ModList.get().getModContainerById(id); if(mContainer.isPresent()) { for(IModInfo.ModVersion version : mContainer.get().getModInfo().getDependencies()) { - this.dependencyGraph.putEdge(id, version.getModId()); + // avoid self-loops + if(!Objects.equals(id, version.getModId())) + this.dependencyGraph.putEdge(id, version.getModId()); } } } From 48409fc5726c3629c62c759f52d2e62d69815cf7 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 22 Jul 2023 11:19:20 -0400 Subject: [PATCH 3/3] Fix concurrency issue in CoFH FlagManager Related: #173 --- .../cofh_core_crash/FlagManagerMixin.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/cofh_core_crash/FlagManagerMixin.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/cofh_core_crash/FlagManagerMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/cofh_core_crash/FlagManagerMixin.java new file mode 100644 index 00000000..f39e12e1 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/cofh_core_crash/FlagManagerMixin.java @@ -0,0 +1,36 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.cofh_core_crash; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.embeddedt.modernfix.annotation.RequiresMod; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Coerce; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.function.BooleanSupplier; + +/** + * Fix getOrCreateFlag accessing the FLAGS map without synchronization by wrapping all calls to it + * in a synchronized block. + */ +@Pseudo +@Mixin(targets = { "cofh/lib/util/flags/FlagManager" }, remap = false) +@RequiresMod("cofh_core") +public class FlagManagerMixin { + @Shadow @Final + private static Object2ObjectOpenHashMap FLAGS; + + @Shadow + private BooleanSupplier getOrCreateFlag(String flag) { + throw new AssertionError(); + } + + @Redirect(method = "*", at = @At(value = "INVOKE", target = "getOrCreateFlag"), require = 0) + private BooleanSupplier getFlag(@Coerce Object flagHandler, String flag) { + if(flagHandler != this) + throw new AssertionError("Redirect targeted bad getOrCreateFlag invocation"); + synchronized (FLAGS) { + return this.getOrCreateFlag(flag); + } + } +}