From 892c3669e02a46fec1d939697c48eebe31e3d551 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Wed, 18 Aug 2021 20:46:33 +0100 Subject: [PATCH] Track the active mod within DeferredWorkQueue (#7973) --- .../net/minecraftforge/fml/DeferredWorkQueue.java | 15 +++++++++------ .../java/net/minecraftforge/fml/ModContainer.java | 4 ++-- .../net/minecraftforge/fml/ModLoadingContext.java | 4 ++-- .../event/lifecycle/ParallelDispatchEvent.java | 4 ++-- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/DeferredWorkQueue.java b/fmlcore/src/main/java/net/minecraftforge/fml/DeferredWorkQueue.java index 475b52d2fa..dafc3af925 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/DeferredWorkQueue.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/DeferredWorkQueue.java @@ -34,8 +34,6 @@ import com.google.common.base.Stopwatch; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import net.minecraftforge.forgespi.language.IModInfo; - /** * Utility for running code on the main launch thread at the next available * opportunity. There is no guaranteed order that work from various mods will be @@ -78,7 +76,12 @@ public class DeferredWorkQueue private static void makeRunnable(TaskInfo ti, Executor executor) { executor.execute(() -> { Stopwatch timer = Stopwatch.createStarted(); - ti.task.run(); + ModLoadingContext.get().setActiveContainer(ti.owner); + try { + ti.task.run(); + } finally { + ModLoadingContext.get().setActiveContainer(null); + } timer.stop(); if (timer.elapsed(TimeUnit.SECONDS) >= 1) { LOGGER.warn(LOADING, "Mod '{}' took {} to run a deferred task.", ti.owner.getModId(), timer); @@ -86,13 +89,13 @@ public class DeferredWorkQueue }); } - public CompletableFuture enqueueWork(final IModInfo modInfo, final Runnable work) { + public CompletableFuture enqueueWork(final ModContainer modInfo, final Runnable work) { return CompletableFuture.runAsync(work, r->tasks.add(new TaskInfo(modInfo, r))); } - public CompletableFuture enqueueWork(final IModInfo modInfo, final Supplier work) { + public CompletableFuture enqueueWork(final ModContainer modInfo, final Supplier work) { return CompletableFuture.supplyAsync(work, r->tasks.add(new TaskInfo(modInfo, r))); } - record TaskInfo(IModInfo owner, Runnable task) {} + record TaskInfo(ModContainer owner, Runnable task) {} } \ No newline at end of file diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java index 56a44b986a..9685beed67 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModContainer.java @@ -116,13 +116,13 @@ public abstract class ModContainer final Executor executor) { return CompletableFuture .runAsync(() -> { - ModLoadingContext.get().setActiveContainer(target, target.contextExtension.get()); + ModLoadingContext.get().setActiveContainer(target); target.activityMap.getOrDefault(target.modLoadingStage, ()->{}).run(); target.acceptEvent(eventGenerator.apply(target)); }, executor) .whenComplete((mc, exception) -> { target.modLoadingStage = stateChangeHandler.apply(target.modLoadingStage, exception); - ModLoadingContext.get().setActiveContainer(null, null); + ModLoadingContext.get().setActiveContainer(null); }); } diff --git a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingContext.java b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingContext.java index 098b065de2..d76e31e64f 100644 --- a/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingContext.java +++ b/fmlcore/src/main/java/net/minecraftforge/fml/ModLoadingContext.java @@ -36,9 +36,9 @@ public class ModLoadingContext private ModContainer activeContainer; - public void setActiveContainer(final ModContainer container, final Object languageExtension) { + public void setActiveContainer(final ModContainer container) { this.activeContainer = container; - this.languageExtension = languageExtension; + this.languageExtension = container == null ? null : container.contextExtension.get(); } public ModContainer getActiveContainer() { diff --git a/src/fmlcommon/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java b/src/fmlcommon/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java index 591bc8e241..1a40f88ff5 100644 --- a/src/fmlcommon/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java +++ b/src/fmlcommon/java/net/minecraftforge/fml/event/lifecycle/ParallelDispatchEvent.java @@ -40,10 +40,10 @@ public class ParallelDispatchEvent extends ModLifecycleEvent { } public CompletableFuture enqueueWork(Runnable work) { - return getQueue().map(q->q.enqueueWork(getContainer().getModInfo(), work)).orElseThrow(()->new RuntimeException("No work queue found!")); + return getQueue().map(q->q.enqueueWork(getContainer(), work)).orElseThrow(()->new RuntimeException("No work queue found!")); } public CompletableFuture enqueueWork(Supplier work) { - return getQueue().map(q->q.enqueueWork(getContainer().getModInfo(), work)).orElseThrow(()->new RuntimeException("No work queue found!")); + return getQueue().map(q->q.enqueueWork(getContainer(), work)).orElseThrow(()->new RuntimeException("No work queue found!")); } } \ No newline at end of file