From 2edca8b575a22d767bef559d1c8050f1e63352b0 Mon Sep 17 00:00:00 2001 From: jediminer543 Date: Fri, 2 Oct 2020 23:41:25 +0100 Subject: [PATCH] Made the mod a modlauncher service, so we can now transform fastutil YAY --- gradle.properties | 7 +- .../org/jmt/mcmt/commands/StatsCommand.java | 10 +- .../FastUtilTransformerService.java | 164 ++++++++++++++++++ ...ods.modlauncher.api.ITransformationService | 1 + 4 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/jmt/mcmt/modlauncher/FastUtilTransformerService.java create mode 100644 src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService diff --git a/gradle.properties b/gradle.properties index 471a575e..f0fc6cb2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false -mcmt_ver=0.16.50 +mcmt_ver=0.17.52 mappings_ver =20200723-1.16.1 mappings_chan=snapshot @@ -18,6 +18,11 @@ fg_ver=32.0.106 #mc_ver=1.16.2 #fg_ver=33.0.5 +# 1.16.3 +# 1.16.3-34.0.5 +#mc_ver=1.16.3 +#fg_ver=34.0.1 + # 1.15.2 # 1.15.2-31.2.31 #mc_ver=1.15.2 diff --git a/src/main/java/org/jmt/mcmt/commands/StatsCommand.java b/src/main/java/org/jmt/mcmt/commands/StatsCommand.java index e9f8ee80..d0962521 100644 --- a/src/main/java/org/jmt/mcmt/commands/StatsCommand.java +++ b/src/main/java/org/jmt/mcmt/commands/StatsCommand.java @@ -107,6 +107,12 @@ public static void setServer(MinecraftServer nmcs) { public static void resetAll() { resetThreadStats = true; } + + static int warningDelay = 15000; + + public static void resetWarnDelay() { + warningDelay = 15000; + } public static void runDataThread() { statsThread = new Thread(() -> { @@ -186,8 +192,10 @@ public static void runDataThread() { } warnLog++; - if (warnLog % 15000 == 0) { + if (warnLog % warningDelay == 0) { mtlog.warn("MCMT is enabled; error logs are invalid for any other mods"); + warningDelay *= 1.2; + warningDelay = Math.min(warningDelay, 720000); // Max delay ~~ 2 hours } } } catch (Exception e) { diff --git a/src/main/java/org/jmt/mcmt/modlauncher/FastUtilTransformerService.java b/src/main/java/org/jmt/mcmt/modlauncher/FastUtilTransformerService.java new file mode 100644 index 00000000..1ec014ee --- /dev/null +++ b/src/main/java/org/jmt/mcmt/modlauncher/FastUtilTransformerService.java @@ -0,0 +1,164 @@ +package org.jmt.mcmt.modlauncher; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.Map.Entry; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.MethodNode; + +import cpw.mods.modlauncher.api.IEnvironment; +import cpw.mods.modlauncher.api.ITransformationService; +import cpw.mods.modlauncher.api.ITransformer; +import cpw.mods.modlauncher.api.ITransformerVotingContext; +import cpw.mods.modlauncher.api.IncompatibleEnvironmentException; +import cpw.mods.modlauncher.api.TransformerVoteResult; + +public class FastUtilTransformerService implements ITransformer, ITransformationService { + + private static final Logger LOGGER = LogManager.getLogger(); + private boolean isActive = true; + + @Override + public String name() { + return "sync_fu"; + } + + @Override + public void initialize(IEnvironment environment) {} + + @Override + public void beginScanning(IEnvironment environment) {} + + @Override + public void onLoad(IEnvironment env, Set otherServices) throws IncompatibleEnvironmentException {} + + + @Override + public Entry, Supplier>>> additionalClassesLocator() { + LOGGER.info("Sync_Fu preparing..."); + Optional fujarurl = Arrays.stream(System.getProperty("java.class.path").split(File.pathSeparator)).flatMap(path -> { + File file = new File(path); + if (file.isDirectory()) { + return Arrays.stream(file.list((d, n) -> n.endsWith(".jar"))); + } + return Arrays.stream(new String[] {path}); + }) + .filter(p -> p.contains("fastutil")) // Can add more if necesary; + .map(Paths::get) + .map(path -> { + try { + return path.toUri().toURL(); + } catch (Exception e) { + return null; + } + }).findFirst(); + URL rootUrl = null; + try { + rootUrl = fujarurl.get(); + } catch (Exception e) { + LOGGER.warn("Failed to find FastUtil jar; this WILL result in more exceptions"); + isActive = false; + } + LOGGER.info("Sync_Fu found fu..."); + if (!isActive) { + // We are dead + return null; + } + final URL rootURLf = rootUrl; + return new Entry, Supplier>>>() { + + @Override + public Set getKey() { + Set out = new HashSet(); + out.add("it.unimi.dsi.fastutil."); + return out; + } + + @Override + public Supplier>> getValue() { + return () -> { + return s -> { + URL urlOut; + try { + urlOut = new URL("jar:" + rootURLf.toString() + "!/" + s); + //LOGGER.debug(urlOut.toString()); + return Optional.of(urlOut); + } catch (MalformedURLException e) { + e.printStackTrace(); + return null; + } + }; + }; + } + + @Override + public Supplier>> setValue(Supplier>> value) { + throw new IllegalStateException(); + } + + }; + } + + @SuppressWarnings("rawtypes") + @Override + public List transformers() { + List out = new ArrayList<>(); + out.add(this); + return out; + } + + int posfilter = Opcodes.ACC_PUBLIC; + int negfilter = Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT | Opcodes.ACC_ABSTRACT | Opcodes.ACC_BRIDGE; + + private static final Marker marker = MarkerManager.getMarker("JMTSUPERTRANS"); + + @Override + public ClassNode transform(ClassNode input, ITransformerVotingContext context) { + LOGGER.info(marker, "sync_fu " + input.name + " Transformer Called"); + for (MethodNode mn : input.methods) { + if ((mn.access & posfilter) == posfilter + && (mn.access & negfilter) == 0 + && !mn.name.equals("")) { + mn.access |= Opcodes.ACC_SYNCHRONIZED; + LOGGER.debug(marker, "Patching " + mn.name); + } + } + LOGGER.info(marker, "sync_fu " + input.name + " Transformer Complete"); + return input; + } + + @Override + public TransformerVoteResult castVote(ITransformerVotingContext context) { + return TransformerVoteResult.YES; + } + + @Override + public Set targets() { + Set out = new HashSet(); + if (!isActive) { + // Is Dead + return out; + } + out.add(Target.targetClass("it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap")); + out.add(Target.targetClass("it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet")); + out.add(Target.targetClass("it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap")); + return out; + } + +} diff --git a/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService b/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService new file mode 100644 index 00000000..62647f6a --- /dev/null +++ b/src/main/resources/META-INF/services/cpw.mods.modlauncher.api.ITransformationService @@ -0,0 +1 @@ +org.jmt.mcmt.modlauncher.FastUtilTransformerService \ No newline at end of file