From 11a37d59ecf57275291a7494fabaad4d5b5a5e8f Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 4 May 2023 10:25:47 -0400 Subject: [PATCH 1/2] Ignore exceptions thrown by structure upgrade command --- .../org/embeddedt/modernfix/command/ModernFixCommands.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 8c7a4222..e77e2ffc 100644 --- a/common/src/main/java/org/embeddedt/modernfix/command/ModernFixCommands.java +++ b/common/src/main/java/org/embeddedt/modernfix/command/ModernFixCommands.java @@ -7,9 +7,9 @@ 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.util.Collection; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -41,7 +41,8 @@ public class ModernFixCommands { try(Resource resource = manager.getResource(found)) { CachingStructureManager.readStructureTag(structureLocation, level.getServer().getFixerUpper(), resource.getInputStream()); context.getSource().sendSuccess(new TextComponent("checked " + structureLocation + " (" + upgradedNum + "/" + structures.size() + ")"), false); - } catch(IOException e) { + } catch(Throwable e) { + ModernFix.LOGGER.error("Couldn't upgrade structure " + found, e); context.getSource().sendFailure(new TextComponent("error reading " + structureLocation + " (" + upgradedNum + "/" + structures.size() + ")")); } } From 4796af209472245ee4ed0f871ee1dbfb08345ed8 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Thu, 4 May 2023 11:16:16 -0400 Subject: [PATCH 2/2] Fix DFU blaster making DFU too slow --- .../embeddedt/modernfix/dfu/DFUBlaster.java | 36 ++++++++++++++----- .../modernfix/dfu/LazyDataFixer.java | 1 + .../forge/ModernFixPlatformHooksImpl.java | 2 -- 3 files changed, 29 insertions(+), 10 deletions(-) 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 4284e4bc..314dc634 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 bde0640d..d2c84cf8 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 @@ -28,7 +28,6 @@ import net.minecraftforge.fml.server.ServerLifecycleHooks; import org.embeddedt.modernfix.forge.classloading.FastAccessTransformerList; import org.embeddedt.modernfix.forge.classloading.ModernFixResourceFinder; 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; @@ -157,7 +156,6 @@ public class ModernFixPlatformHooksImpl { } FastAccessTransformerList.attemptReplace(); - DFUBlaster.blastMaps(); /* https://github.com/FabricMC/Mixin/pull/99 */ try {