From fb51a31dd274c121763a42a7919e3c26524f6883 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 9 Jun 2024 21:57:15 -0400 Subject: [PATCH] Add option to disable thread pool --- .../ChunkRenderDispatcherMixin.java | 28 ++++++++++++ .../UtilMixin.java | 16 +++++++ .../core/config/ModernFixEarlyConfig.java | 1 + .../modernfix/util/DirectExecutorService.java | 43 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/ChunkRenderDispatcherMixin.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/UtilMixin.java create mode 100644 common/src/main/java/org/embeddedt/modernfix/util/DirectExecutorService.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/ChunkRenderDispatcherMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/ChunkRenderDispatcherMixin.java new file mode 100644 index 00000000..0b3fdaba --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/ChunkRenderDispatcherMixin.java @@ -0,0 +1,28 @@ +package org.embeddedt.modernfix.common.mixin.feature.cause_lag_by_disabling_threads; + +import net.minecraft.client.renderer.chunk.ChunkRenderDispatcher; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +@Mixin(ChunkRenderDispatcher.class) +@ClientOnlyMixin +public class ChunkRenderDispatcherMixin { + private static final Executor MFIX_CHUNK_BUILD_EXECUTOR = new ThreadPoolExecutor(1, computeNumThreads(), 0L, TimeUnit.SECONDS, new LinkedBlockingQueue<>()); + + private static int computeNumThreads() { + return Math.max(Math.min(Runtime.getRuntime().availableProcessors() / 4, 10), 1); + } + + @ModifyVariable(method = "*", at = @At("HEAD"), ordinal = 0, argsOnly = true) + private static Executor replaceExecutor(Executor old) { + return MFIX_CHUNK_BUILD_EXECUTOR; + } +} diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/UtilMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/UtilMixin.java new file mode 100644 index 00000000..a8b452bd --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/cause_lag_by_disabling_threads/UtilMixin.java @@ -0,0 +1,16 @@ +package org.embeddedt.modernfix.common.mixin.feature.cause_lag_by_disabling_threads; + +import net.minecraft.Util; +import org.embeddedt.modernfix.util.DirectExecutorService; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.concurrent.ExecutorService; + +@Mixin(Util.class) +public class UtilMixin { + @Shadow @Final @Mutable + private static final ExecutorService BACKGROUND_EXECUTOR = new DirectExecutorService(); +} diff --git a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 3adfd91a..25c1d99a 100644 --- a/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/common/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -166,6 +166,7 @@ public class ModernFixEarlyConfig { .put("mixin.feature.stalled_chunk_load_detection", false) .put("mixin.perf.blast_search_trees.force", false) .put("mixin.bugfix.restore_old_dragon_movement", false) + .put("mixin.feature.cause_lag_by_disabling_threads", false) .put("mixin.perf.clear_mixin_classinfo", false) .put("mixin.perf.deduplicate_climate_parameters", false) .put("mixin.bugfix.packet_leak", false) diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DirectExecutorService.java b/common/src/main/java/org/embeddedt/modernfix/util/DirectExecutorService.java new file mode 100644 index 00000000..83b5d0aa --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/util/DirectExecutorService.java @@ -0,0 +1,43 @@ +package org.embeddedt.modernfix.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.concurrent.AbstractExecutorService; +import java.util.concurrent.TimeUnit; + +public class DirectExecutorService extends AbstractExecutorService { + private boolean isShutdown; + + @Override + public void shutdown() { + isShutdown = true; + } + + @NotNull + @Override + public List shutdownNow() { + isShutdown = true; + return List.of(); + } + + @Override + public boolean isShutdown() { + return isShutdown; + } + + @Override + public boolean isTerminated() { + return isShutdown; + } + + @Override + public boolean awaitTermination(long timeout, @NotNull TimeUnit unit) throws InterruptedException { + return true; + } + + @Override + public void execute(@NotNull Runnable command) { + command.run(); + } +}