From b97922732211fcf5d70f6093a78ee1d2ef11d8f6 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Wed, 27 Oct 2021 16:24:52 +0800 Subject: [PATCH] Configure mod bootstrap in main thread --- arclight-forge/build.gradle | 1 + .../izzel/arclight/boot/asm/ArclightImplementer.java | 3 +++ .../izzel/arclight/boot/mod/ArclightLocator_Forge.java | 2 -- .../java/io/izzel/arclight/boot/mod/ModBootstrap.java | 10 +++++----- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/arclight-forge/build.gradle b/arclight-forge/build.gradle index 1875d077..e0207642 100644 --- a/arclight-forge/build.gradle +++ b/arclight-forge/build.gradle @@ -69,6 +69,7 @@ dependencies { implementation 'net.minecraftforge:forgespi:4.0.9' gson 'com.google.code.gson:gson:2.8.8' implementation 'org.apache.logging.log4j:log4j-api:2.14.1' + implementation 'org.apache.logging.log4j:log4j-core:2.14.1' implementation 'org.jetbrains:annotations:19.0.0' implementation 'org.spongepowered:mixin:0.8.3' implementation 'org.apache.logging.log4j:log4j-jul:2.14.1' diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/ArclightImplementer.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/ArclightImplementer.java index 84146c0c..4d197f49 100644 --- a/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/ArclightImplementer.java +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/asm/ArclightImplementer.java @@ -3,6 +3,7 @@ package io.izzel.arclight.boot.asm; import cpw.mods.modlauncher.api.NamedPath; import cpw.mods.modlauncher.serviceapi.ILaunchPluginService; import io.izzel.arclight.boot.log.ArclightI18nLogger; +import io.izzel.arclight.boot.mod.ModBootstrap; import org.apache.logging.log4j.Logger; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -46,6 +47,8 @@ public class ArclightImplementer implements ILaunchPluginService { @Override public void initializeLaunch(ITransformerLoader transformerLoader, NamedPath[] specialPaths) { + // runs after TX CL built + ModBootstrap.postRun(); this.transformerLoader = transformerLoader; this.implementers.put("inventory", new InventoryImplementer()); this.implementers.put("switch", SwitchTableFixer.INSTANCE); diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java index 6d6b8c94..cbe7bb73 100644 --- a/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ArclightLocator_Forge.java @@ -42,8 +42,6 @@ public class ArclightLocator_Forge implements IModLocator { @Override public void scanFile(IModFile file, Consumer pathConsumer) { - // runs after TX CL built - ModBootstrap.postRun(); final Function status = p -> file.getSecureJar().verifyPath(p); try (Stream files = Files.find(file.getSecureJar().getRootPath(), Integer.MAX_VALUE, (p, a) -> p.getNameCount() > 0 && p.getFileName().toString().endsWith(".class"))) { file.setSecurityStatus(files.peek(pathConsumer).map(status).reduce((s1, s2) -> SecureJar.Status.values()[Math.min(s1.ordinal(), s2.ordinal())]).orElse(SecureJar.Status.INVALID)); diff --git a/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ModBootstrap.java b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ModBootstrap.java index 1378d09f..05c11bf0 100644 --- a/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ModBootstrap.java +++ b/arclight-forge/src/main/java/io/izzel/arclight/boot/mod/ModBootstrap.java @@ -26,9 +26,9 @@ import java.util.Set; public class ModBootstrap extends AbstractBootstrap { - public static record ModBoot(Configuration configuration, Thread thread, ClassLoader parent) {} + public static record ModBoot(Configuration configuration, ClassLoader parent) {} - private static volatile ModBoot modBoot; + private static ModBoot modBoot; static void run() { var plugin = Launcher.INSTANCE.environment().findLaunchPlugin("arclight_implementer"); @@ -46,12 +46,12 @@ public class ModBootstrap extends AbstractBootstrap { } @SuppressWarnings("unchecked") - static void postRun() { + public static void postRun() { if (modBoot == null) return; try { var conf = modBoot.configuration(); var parent = modBoot.parent(); - var classLoader = (ModuleClassLoader) modBoot.thread().getContextClassLoader(); + var classLoader = (ModuleClassLoader) Thread.currentThread().getContextClassLoader(); var parentField = ModuleClassLoader.class.getDeclaredField("parentLoaders"); var parentLoaders = (Map) Unsafe.getObject(classLoader, Unsafe.objectFieldOffset(parentField)); for (var mod : conf.modules()) { @@ -116,7 +116,7 @@ public class ModBootstrap extends AbstractBootstrap { var confOffset = Unsafe.objectFieldOffset(configurationField); var oldConf = (Configuration) Unsafe.getObject(classLoader, confOffset); var conf = oldConf.resolveAndBind(JarModuleFinder.of(secureJar), ModuleFinder.of(), List.of(secureJar.name())); - modBoot = new ModBoot(conf, Thread.currentThread(), classLoader); + modBoot = new ModBoot(conf, classLoader); Unsafe.putObjectVolatile(classLoader, confOffset, conf); var pkgField = ModuleClassLoader.class.getDeclaredField("packageLookup"); var packageLookup = (Map) Unsafe.getObject(classLoader, Unsafe.objectFieldOffset(pkgField));