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] 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 {