diff --git a/leaf-server/minecraft-patches/features/0169-Multithreaded-Tracker.patch b/leaf-server/minecraft-patches/features/0169-Multithreaded-Tracker.patch index a903e074..1a22dea5 100644 --- a/leaf-server/minecraft-patches/features/0169-Multithreaded-Tracker.patch +++ b/leaf-server/minecraft-patches/features/0169-Multithreaded-Tracker.patch @@ -1176,14 +1176,14 @@ index add696ec1835eb161d6fc94509a2a77febd23d69..ca948c0f4f48b567b66e4b992eef99d3 if (this.entity instanceof ServerPlayer) { ((ServerPlayer)this.entity).connection.send(packet); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 08d12a1acc3a672a77daa15f82392cd603c30283..b4ee1682a851eb8f1fae999ba0913ae300a71a89 100644 +index 08d12a1acc3a672a77daa15f82392cd603c30283..b0ac6de9e0f15d234781fc43dd6fd1d5cd6c5ddf 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -216,6 +216,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) public boolean hasRidableMoveEvent = false; // Purpur - Ridables final List realPlayers; // Leaves - skip -+ public @Nullable java.util.concurrent.Future[] trackerTask; // Leaf - Multithreaded tracker ++ public volatile @Nullable java.util.concurrent.Future[] trackerTask; // Leaf - Multithreaded tracker @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { diff --git a/leaf-server/minecraft-patches/features/0230-Async-target-finding.patch b/leaf-server/minecraft-patches/features/0230-Async-target-finding.patch index cd2817da..ab550e0f 100644 --- a/leaf-server/minecraft-patches/features/0230-Async-target-finding.patch +++ b/leaf-server/minecraft-patches/features/0230-Async-target-finding.patch @@ -134,7 +134,7 @@ index 9b8d119116b0c3a51d3fe2ff7efb33cc39627cc4..436e73086678e4afbf94f1b7bca9b0c7 // Gale start - Pufferfish - SIMD support diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 65f6cd4508c41f14930f768575fe26dc80c9a2fa..ccb0913370e862e936f2a23289d4d49ce8773759 100644 +index 68bba7703ffcbeb1bf18d7dfdba9dbb21fe9d4b5..cc88326fc1017605c65b32a7a124cc8734281a86 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -175,7 +175,16 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -158,7 +158,7 @@ index 65f6cd4508c41f14930f768575fe26dc80c9a2fa..ccb0913370e862e936f2a23289d4d49c @@ -220,6 +229,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public boolean hasRidableMoveEvent = false; // Purpur - Ridables final List realPlayers; // Leaves - skip - public @Nullable java.util.concurrent.Future[] trackerTask; // Leaf - Multithreaded tracker + public volatile @Nullable java.util.concurrent.Future[] trackerTask; // Leaf - Multithreaded tracker + public final @Nullable org.dreeam.leaf.async.ai.AsyncGoalExecutor asyncGoalExecutor; // Leaf - Async target finding @Override diff --git a/leaf-server/src/main/java/org/dreeam/leaf/async/FixedThreadExecutor.java b/leaf-server/src/main/java/org/dreeam/leaf/async/FixedThreadExecutor.java index 9c696a0d..06d82fc9 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/async/FixedThreadExecutor.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/async/FixedThreadExecutor.java @@ -9,7 +9,7 @@ import java.util.concurrent.locks.LockSupport; public final class FixedThreadExecutor { private final Thread[] workers; - private final MpmcQueue channel; + public final MpmcQueue channel; private static volatile boolean SHUTDOWN = false; public FixedThreadExecutor(int numThreads, int queue, String prefix) { @@ -72,12 +72,17 @@ public final class FixedThreadExecutor { private record Worker(MpmcQueue channel) implements Runnable { @Override public void run() { - while (!SHUTDOWN) { + while (true) { final Runnable task = channel.recv(); if (task != null) { task.run(); - } else if (!SHUTDOWN) { - LockSupport.park(); + } else if (SHUTDOWN) { + break; + } else if (channel.isEmpty()) { + Thread.yield(); + if (channel.isEmpty()) { + LockSupport.park(); + } } } } diff --git a/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java b/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java index 554a6758..02aae342 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/async/tracker/AsyncTracker.java @@ -66,6 +66,10 @@ public final class AsyncTracker { } public static void onTickEnd(MinecraftServer server) { + if (!TRACKER_EXECUTOR.channel.isEmpty()) { + // not likely + TRACKER_EXECUTOR.unpack(); + } for (ServerLevel world : server.getAllLevels()) { Future[] task = world.trackerTask; if (task != null) {