From 8cdc425d7dd51fb338db7e56e5e78cd8026542cc Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 22 Jan 2023 18:07:48 -0500 Subject: [PATCH] Ensure the main thread does not spin when no tasks are available --- .../core/config/ModernFixEarlyConfig.java | 2 +- .../SyncExecutorMixin.java | 30 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 3 +- 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/perf/sync_executor_sleep/SyncExecutorMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index f712387e..f8ceb873 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -30,7 +30,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.async_jei", true); this.addMixinRule("perf.thread_priorities", true); this.addMixinRule("perf.preload_block_classes", false); - this.addMixinRule("perf.defer_voxelshape_optimize", false); + this.addMixinRule("perf.sync_executor_sleep", true); this.addMixinRule("perf.parallel_blockstate_cache_rebuild", true); this.addMixinRule("perf.deduplicate_location", true); this.addMixinRule("safety", true); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/perf/sync_executor_sleep/SyncExecutorMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/perf/sync_executor_sleep/SyncExecutorMixin.java new file mode 100644 index 00000000..5d092e1d --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/perf/sync_executor_sleep/SyncExecutorMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.mixin.perf.sync_executor_sleep; + +import net.minecraftforge.fml.ModWorkManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.ConcurrentLinkedDeque; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.LockSupport; + +@Mixin(targets = "net/minecraftforge/fml/ModWorkManager$SyncExecutor") +public class SyncExecutorMixin { + @Shadow private ConcurrentLinkedDeque tasks; + private static final long PARK_TIME = TimeUnit.MILLISECONDS.toNanos(50); + /** + * Currently FML spins in driveOne while waiting for the modloading workers. We can improve this + * by sleeping for 50ms at a time. + * @author embeddedt + * @reason improve CPU efficiency + */ + @Inject(method = "driveOne", at = @At("HEAD"), remap = false) + private void sleepWhileNoTasks(CallbackInfoReturnable cir) { + if(tasks.isEmpty()) + LockSupport.parkNanos(PARK_TIME); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 3b29090d..f1b0a649 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -22,7 +22,8 @@ "perf.parallel_blockstate_cache_rebuild.BlocksMixin", "perf.parallel_blockstate_cache_rebuild.BlockCallbacksMixin", "perf.parallel_blockstate_cache_rebuild.ShapeCacheMixin", - "perf.deduplicate_location.MixinResourceLocation" + "perf.deduplicate_location.MixinResourceLocation", + "perf.sync_executor_sleep.SyncExecutorMixin" ], "client": [ "perf.skip_first_datapack_reload.MinecraftMixin",