Skip to content

Commit dbff17a

Browse files
committed
Better fix for config corruption
Defer posting of all config reload events to the main thread, and don't process any until after the launch finishes. This should hopefully fix some synchronization issues
1 parent 1989f12 commit dbff17a

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

forge/src/main/java/org/embeddedt/modernfix/forge/config/NightConfigFixer.java

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,21 @@
33
import com.electronwill.nightconfig.core.file.FileWatcher;
44
import cpw.mods.modlauncher.api.LamdbaExceptionUtils;
55
import net.minecraftforge.fml.common.ObfuscationReflectionHelper;
6+
import org.embeddedt.modernfix.ModernFix;
67
import org.embeddedt.modernfix.core.ModernFixMixinPlugin;
78
import org.embeddedt.modernfix.util.CommonModUtil;
89

910
import java.lang.reflect.Field;
1011
import java.nio.file.Path;
12+
import java.util.ArrayList;
1113
import java.util.LinkedHashSet;
14+
import java.util.List;
1215
import java.util.concurrent.ConcurrentHashMap;
1316
import java.util.function.Function;
1417

1518
public class NightConfigFixer {
1619
public static final LinkedHashSet<Runnable> configsToReload = new LinkedHashSet<>();
20+
private static int tickCounter = 0;
1721
public static void monitorFileWatcher() {
1822
if(!ModernFixMixinPlugin.instance.isOptionEnabled("bugfix.fix_config_crashes.NightConfigFixerMixin"))
1923
return;
@@ -28,6 +32,30 @@ public static void monitorFileWatcher() {
2832
}, "replacing Night Config watchedFiles map");
2933
}
3034

35+
/**
36+
* Called by the render thread on the client, and the server thread on the server. Processes all the accumulated
37+
* file watch events.
38+
*/
39+
public static void runReloads() {
40+
if((tickCounter++ % 20) != 0)
41+
return;
42+
List<Runnable> runnablesToRun;
43+
synchronized (configsToReload) {
44+
if(configsToReload.isEmpty())
45+
return;
46+
runnablesToRun = new ArrayList<>(configsToReload);
47+
configsToReload.clear();
48+
}
49+
ModernFix.LOGGER.info("Processing {} config reloads", runnablesToRun.size());
50+
for(Runnable r : runnablesToRun) {
51+
try {
52+
r.run();
53+
} catch(RuntimeException e) {
54+
e.printStackTrace();
55+
}
56+
}
57+
}
58+
3159
private static final Class<?> WATCHED_FILE = LamdbaExceptionUtils.uncheck(() -> Class.forName("com.electronwill.nightconfig.core.file.FileWatcher$WatchedFile"));
3260
private static final Field CHANGE_HANDLER = ObfuscationReflectionHelper.findField(WATCHED_FILE, "changeHandler");
3361

@@ -59,17 +87,12 @@ static class MonitoringConfigTracker implements Runnable {
5987
}
6088

6189
/**
62-
* Add the config
90+
* Add the config runnable to the list to be processed by the main thread.
6391
*/
6492
@Override
6593
public void run() {
6694
synchronized(configsToReload) {
67-
int oldSize = configsToReload.size();
6895
configsToReload.add(configTracker);
69-
if(oldSize == 0) {
70-
ModernFixMixinPlugin.instance.logger.info("Config file change detected on disk. The Forge feature to watch config files for changes is currently disabled due to random corruption issues.");
71-
ModernFixMixinPlugin.instance.logger.info("This functionality will be restored in a future ModernFix update.");
72-
}
7396
}
7497
}
7598
}

forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixClientForge.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import net.minecraft.client.KeyMapping;
55
import net.minecraft.client.Minecraft;
66
import net.minecraft.client.gui.components.DebugScreenOverlay;
7+
import net.minecraftforge.api.distmarker.Dist;
78
import net.minecraftforge.client.event.RecipesUpdatedEvent;
89
import net.minecraftforge.client.event.RenderGameOverlayEvent;
910
import net.minecraftforge.client.gui.ForgeIngameGui;
@@ -20,7 +21,9 @@
2021
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
2122
import net.minecraftforge.fml.event.server.FMLServerStartedEvent;
2223
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
24+
import net.minecraftforge.fml.loading.FMLEnvironment;
2325
import org.embeddedt.modernfix.ModernFixClient;
26+
import org.embeddedt.modernfix.forge.config.NightConfigFixer;
2427
import org.embeddedt.modernfix.screen.ModernFixConfigScreen;
2528

2629
import java.util.ArrayList;
@@ -51,6 +54,9 @@ public void onConfigKey(TickEvent.ClientTickEvent event) {
5154
if(event.phase == TickEvent.Phase.START && configKey.consumeClick()) {
5255
Minecraft.getInstance().setScreen(new ModernFixConfigScreen(Minecraft.getInstance().screen));
5356
}
57+
if(FMLEnvironment.dist == Dist.CLIENT && event.phase == TickEvent.Phase.START && ModernFixForge.launchDone) {
58+
NightConfigFixer.runReloads();
59+
}
5460
}
5561

5662
private static final List<String> brandingList = new ArrayList<>();

forge/src/main/java/org/embeddedt/modernfix/forge/init/ModernFixForge.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import net.minecraftforge.common.MinecraftForge;
77
import net.minecraftforge.event.OnDatapackSyncEvent;
88
import net.minecraftforge.event.RegistryEvent;
9+
import net.minecraftforge.event.TickEvent;
910
import net.minecraftforge.eventbus.api.EventPriority;
1011
import net.minecraftforge.eventbus.api.SubscribeEvent;
1112
import net.minecraftforge.fml.*;
@@ -15,6 +16,7 @@
1516
import net.minecraftforge.fml.event.server.FMLServerStartedEvent;
1617
import net.minecraftforge.fml.event.server.FMLServerStoppedEvent;
1718
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
19+
import net.minecraftforge.fml.loading.FMLEnvironment;
1820
import net.minecraftforge.fml.loading.FMLLoader;
1921
import net.minecraftforge.fml.network.FMLNetworkConstants;
2022
import net.minecraftforge.fml.server.ServerLifecycleHooks;
@@ -27,6 +29,7 @@
2729
import org.embeddedt.modernfix.forge.ModernFixConfig;
2830
import org.embeddedt.modernfix.entity.EntityDataIDSyncHandler;
2931
import org.embeddedt.modernfix.forge.config.ConfigFixer;
32+
import org.embeddedt.modernfix.forge.config.NightConfigFixer;
3033
import org.embeddedt.modernfix.forge.packet.PacketHandler;
3134
import org.embeddedt.modernfix.forge.registry.ObjectHolderClearer;
3235
import org.embeddedt.modernfix.forge.util.KubeUtil;
@@ -36,6 +39,7 @@
3639
@Mod(ModernFix.MODID)
3740
public class ModernFixForge {
3841
private static ModernFix commonMod;
42+
public static boolean launchDone = false;
3943

4044
public ModernFixForge() {
4145
commonMod = new ModernFix();
@@ -54,6 +58,13 @@ public ModernFixForge() {
5458
ConfigFixer.replaceConfigHandlers();
5559
}
5660

61+
@SubscribeEvent
62+
public void onServerTick(TickEvent.ServerTickEvent event) {
63+
if(FMLEnvironment.dist == Dist.DEDICATED_SERVER && event.phase == TickEvent.Phase.END && ModernFixForge.launchDone) {
64+
NightConfigFixer.runReloads();
65+
}
66+
}
67+
5768
@SubscribeEvent
5869
public void onDatapackSync(OnDatapackSyncEvent event) {
5970
if(event.getPlayer() != null) {

forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.embeddedt.modernfix.forge.classloading.FastAccessTransformerList;
3131
import org.embeddedt.modernfix.forge.classloading.ModernFixResourceFinder;
3232
import org.embeddedt.modernfix.forge.config.NightConfigFixer;
33+
import org.embeddedt.modernfix.forge.init.ModernFixForge;
3334
import org.embeddedt.modernfix.forge.packet.PacketHandler;
3435
import org.embeddedt.modernfix.forge.spark.SparkLaunchProfiler;
3536
import org.embeddedt.modernfix.platform.ModernFixPlatformHooks;
@@ -270,6 +271,7 @@ public void onLaunchComplete() {
270271
if(ModernFixMixinPlugin.instance.isOptionEnabled("feature.spark_profile_launch.OnForge")) {
271272
CommonModUtil.runWithoutCrash(() -> SparkLaunchProfiler.stop("launch"), "Failed to stop profiler");
272273
}
274+
ModernFixForge.launchDone = true;
273275
}
274276

275277
public String getPlatformName() {

0 commit comments

Comments
 (0)