From eddb7fa166ba0e701aa4f0a36dfc9b7de8c67671 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 31 Mar 2024 09:26:38 -0400 Subject: [PATCH] Use low-priority overwrite so other mixins can also apply --- .../BlockableEventLoopMixin.java | 23 ++++++------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/fix_loop_spin_waiting/BlockableEventLoopMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/fix_loop_spin_waiting/BlockableEventLoopMixin.java index 8348f414..fba53257 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/fix_loop_spin_waiting/BlockableEventLoopMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/fix_loop_spin_waiting/BlockableEventLoopMixin.java @@ -2,31 +2,22 @@ package org.embeddedt.modernfix.common.mixin.perf.fix_loop_spin_waiting; import net.minecraft.util.thread.BlockableEventLoop; 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.Redirect; +import org.spongepowered.asm.mixin.Overwrite; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.LockSupport; // This should fix https://bugs.mojang.com/browse/MC-183518 -@Mixin(BlockableEventLoop.class) +@Mixin(value = BlockableEventLoop.class, priority = 500) public class BlockableEventLoopMixin { - /** - * @author embeddedt - * @reason yielding the thread is pretty pointless if we're about to park anyway - */ - @Redirect(method = "waitForTasks", at = @At(value = "INVOKE", target = "Ljava/lang/Thread;yield()V"), require = 0) - private void doNotYield() {} - private static final long MFIX$TICK_WAIT_TIME = TimeUnit.MILLISECONDS.toNanos(2); /** * @author embeddedt - * @reason park for more than 0.1ms at a time. Task submission will call unpark(), so the thread will become - * runnable again if a task is submitted. + * @reason yielding the thread is pretty pointless if we're about to park anyway */ - @ModifyArg(method = "waitForTasks", at = @At(value = "INVOKE", target = "Ljava/util/concurrent/locks/LockSupport;parkNanos(Ljava/lang/Object;J)V"), index = 1, require = 0) - private long changeParkDuration(long originalDuration) { - return MFIX$TICK_WAIT_TIME; + @Overwrite + protected void waitForTasks() { + LockSupport.parkNanos("waiting for tasks", MFIX$TICK_WAIT_TIME); } }