From 501e030f3ed0db1606547166ad2e753e3e38424c Mon Sep 17 00:00:00 2001 From: LexManos Date: Tue, 3 Apr 2018 15:23:35 -0700 Subject: [PATCH] Add support for World Workers skipping ticks without being removed from the worker list. --- .../common/WorldWorkerManager.java | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/WorldWorkerManager.java b/src/main/java/net/minecraftforge/common/WorldWorkerManager.java index 4e84cd0189..8f5448c9ab 100644 --- a/src/main/java/net/minecraftforge/common/WorldWorkerManager.java +++ b/src/main/java/net/minecraftforge/common/WorldWorkerManager.java @@ -25,6 +25,7 @@ public class WorldWorkerManager { private static List workers = new ArrayList(); private static long startTime = -1; + private static int index = 0; public static void tick(boolean start) { @@ -34,6 +35,7 @@ public class WorldWorkerManager return; } + index = 0; IWorker task = getNext(); if (task == null) return; @@ -43,14 +45,18 @@ public class WorldWorkerManager time = 10; //If ticks are lagging, give us at least 10ms to do something. time += System.currentTimeMillis(); - while (System.currentTimeMillis() < time) + while (System.currentTimeMillis() < time && task != null) { - task.work(); + boolean again = task.doWork(); if (!task.hasWork()) { - time = 0; //Break loop remove(task); + task = getNext(); + } + else if (!again) + { + task = getNext(); } } } @@ -62,12 +68,13 @@ public class WorldWorkerManager private static synchronized IWorker getNext() { - return workers.size() > 0 ? workers.get(0) : null; + return workers.size() > index ? workers.get(index++) : null; } private static synchronized void remove(IWorker worker) { workers.remove(worker); + index--; } //Internal only, used to clear everything when the server shuts down. @@ -79,6 +86,17 @@ public class WorldWorkerManager public static interface IWorker { boolean hasWork(); - void work(); + + default void work() {}; //TODO: Remove in 1.13. + + /** + * Perform a task, returning true from this will have the manager call this function again this tick if there is time left. + * Returning false will skip calling this worker until next tick. + */ + default boolean doWork() + { + work(); + return true; + } } }