From aa3fa93a9f7493ac8c4d3851b78676e5ffe6ed24 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 19 Jun 2023 20:57:07 -0400 Subject: [PATCH] Add framework to load specific mod classes sequentially, preventing deadlocks --- .../forge/classloading/ClassLoadHack.java | 26 +++++++++++++++++++ .../modernfix/forge/init/ModernFixForge.java | 2 ++ 2 files changed, 28 insertions(+) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java new file mode 100644 index 00000000..169de148 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/classloading/ClassLoadHack.java @@ -0,0 +1,26 @@ +package org.embeddedt.modernfix.forge.classloading; + +/** + * Sometimes mods have classes that circularly reference each other. If each of these classes ends up being loaded + * from two mods, a deadlock occurs. + * + * To avoid this problem we maintain a list of classes that should be loaded early and do it via Class.forName. + */ +public class ClassLoadHack { + private static final String[] classesToLoadEarly = new String[] { + "team.creative.creativecore.common.config.ConfigTypeConveration", + "team.creative.creativecore.common.util.ingredient.CreativeIngredient" + }; + + public static void loadModClasses() { + for(String clzName : classesToLoadEarly) { + try { + Class.forName(clzName); + } catch(Throwable e) { + if(!(e instanceof ClassNotFoundException)) { + e.printStackTrace(); + } + } + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java index 4354ff49..570f5242 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java @@ -21,6 +21,7 @@ import net.minecraftforge.fml.server.ServerLifecycleHooks; import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.lang3.tuple.Pair; import org.embeddedt.modernfix.ModernFix; +import org.embeddedt.modernfix.forge.classloading.ClassLoadHack; import org.embeddedt.modernfix.forge.classloading.ModFileScanDataDeduplicator; import org.embeddedt.modernfix.forge.ModernFixConfig; import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler; @@ -46,6 +47,7 @@ public class ModernFixForge { MinecraftForge.EVENT_BUS.register(KubeUtil.class); PacketHandler.register(); ModFileScanDataDeduplicator.deduplicate(); + ClassLoadHack.loadModClasses(); } @SubscribeEvent