diff --git a/common/src/main/java/org/embeddedt/modernfix/command/ModernFixCommands.java b/common/src/main/java/org/embeddedt/modernfix/command/ModernFixCommands.java index a4431a35..97fcda8c 100644 --- a/common/src/main/java/org/embeddedt/modernfix/command/ModernFixCommands.java +++ b/common/src/main/java/org/embeddedt/modernfix/command/ModernFixCommands.java @@ -7,15 +7,15 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; +import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.structure.CachingStructureManager; -import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static net.minecraft.commands.Commands.*; +import static net.minecraft.commands.Commands.literal; public class ModernFixCommands { public static void register(CommandDispatcher dispatcher) { @@ -43,7 +43,8 @@ public class ModernFixCommands { try(InputStream resource = entry.getValue().open()) { CachingStructureManager.readStructureTag(structureLocation, level.getServer().getFixerUpper(), resource); context.getSource().sendSuccess(Component.literal("checked " + structureLocation + " (" + upgradedNum + "/" + structures.size() + ")"), false); - } catch(IOException e) { + } catch(Throwable e) { + ModernFix.LOGGER.error("Couldn't upgrade structure " + found, e); context.getSource().sendFailure(Component.literal("error reading " + structureLocation + " (" + upgradedNum + "/" + structures.size() + ")")); } } diff --git a/common/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java b/common/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java index b1d78509..bd1b0c5f 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java +++ b/common/src/main/java/org/embeddedt/modernfix/dfu/DFUBlaster.java @@ -17,15 +17,13 @@ import java.util.concurrent.TimeUnit; import java.util.function.IntFunction; public class DFUBlaster { + private static final Cache>, Integer>, RewriteResult> hmapApplyCache = CacheBuilder.newBuilder() + .expireAfterAccess(3, TimeUnit.MINUTES) + .build(); + private static final Cache, TypeRewriteRule, PointFreeRule>, Optional>> rewriteCache = CacheBuilder.newBuilder() + .expireAfterAccess(3, TimeUnit.MINUTES) + .build(); public static void blastMaps() { - Cache>, Integer>, RewriteResult> hmapApplyCache = CacheBuilder.newBuilder() - .maximumSize(200) /* should mean approximately 50MB used max */ - .expireAfterAccess(3, TimeUnit.MINUTES) - .build(); - Cache, TypeRewriteRule, PointFreeRule>, Optional>> rewriteCache = CacheBuilder.newBuilder() - .maximumSize(1000) - .expireAfterAccess(3, TimeUnit.MINUTES) - .build(); try { Class FOLD_CLASS = Class.forName("com.mojang.datafixers.functions.Fold"); Field hmapField = FOLD_CLASS.getDeclaredField("HMAP_APPLY_CACHE"); @@ -41,8 +39,30 @@ public class DFUBlaster { base = unsafe.staticFieldBase(rewriteCacheField); offset = unsafe.staticFieldOffset(rewriteCacheField); unsafe.putObject(base, offset, rewriteCache.asMap()); + new CleanerThread().start(); } catch(Throwable e) { ModernFix.LOGGER.error("Could not replace DFU map", e); } } + + static class CleanerThread extends Thread { + CleanerThread() { + this.setName("DFU cleaning thread"); + this.setPriority(1); + this.setDaemon(true); + } + + @Override + public void run() { + while(true) { + try { + Thread.sleep(15000); + } catch(InterruptedException e){ + return; + } + rewriteCache.cleanUp(); + hmapApplyCache.cleanUp(); + } + } + } } diff --git a/common/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java b/common/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java index d8ece26c..369a5b53 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java +++ b/common/src/main/java/org/embeddedt/modernfix/dfu/LazyDataFixer.java @@ -35,6 +35,7 @@ public class LazyDataFixer implements DataFixer { synchronized (this) { if(backingDataFixer == null) { LOGGER.info("Instantiating Mojang DFU"); + DFUBlaster.blastMaps(); backingDataFixer = dfuSupplier.get(); } } diff --git a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java index 7421781e..60240a84 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java +++ b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java @@ -18,7 +18,6 @@ import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.server.ServerLifecycleHooks; import org.embeddedt.modernfix.forge.classloading.FastAccessTransformerList; import org.embeddedt.modernfix.core.ModernFixMixinPlugin; -import org.embeddedt.modernfix.dfu.DFUBlaster; import org.embeddedt.modernfix.forge.packet.PacketHandler; import org.embeddedt.modernfix.util.DummyList; import org.objectweb.asm.Opcodes; @@ -76,7 +75,6 @@ public class ModernFixPlatformHooksImpl { public static void injectPlatformSpecificHacks() { FastAccessTransformerList.attemptReplace(); - DFUBlaster.blastMaps(); /* https://github.com/FabricMC/Mixin/pull/99 */ try {