From 3b56f00b825d9da1ccb935c585c6ede04287460c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 12 Apr 2023 14:42:11 -0400 Subject: [PATCH] Fix world load freezing if mods access the previous server world --- .../core/config/ModernFixEarlyConfig.java | 1 + .../chunk_deadlock/ServerChunkCacheMixin.java | 32 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 1 + 3 files changed, 34 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 9bf69c7e..d4f7a59c 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -49,6 +49,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("bugfix.packet_leak", false); this.addMixinRule("bugfix.structure_manager_crash", true); this.addMixinRule("bugfix.mc218112", true); + this.addMixinRule("bugfix.chunk_deadlock", true); this.addMixinRule("bugfix.tf_cme_on_load", modPresent("twilightforest")); this.addMixinRule("bugfix.refinedstorage", modPresent("refinedstorage")); this.addMixinRule("perf.async_jei", modPresent("jei")); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java new file mode 100644 index 00000000..9ebcac80 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/chunk_deadlock/ServerChunkCacheMixin.java @@ -0,0 +1,32 @@ +package org.embeddedt.modernfix.mixin.bugfix.chunk_deadlock; + +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.EmptyLevelChunk; +import org.embeddedt.modernfix.ModernFix; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = ServerChunkCache.class, priority = 1100) +public abstract class ServerChunkCacheMixin { + @Shadow @Final private Thread mainThread; + @Shadow @Final public ServerLevel level; + private final boolean debugDeadServerAccess = Boolean.getBoolean("modernfix.debugBadChunkloading"); + @Inject(method = "getChunk", at = @At("HEAD"), cancellable = true) + private void bailIfServerDead(int chunkX, int chunkZ, ChunkStatus requiredStatus, boolean load, CallbackInfoReturnable cir) { + if(!this.mainThread.isAlive()) { + ModernFix.LOGGER.fatal("A mod is accessing chunks from a stopped server (this will also cause memory leaks)"); + if(debugDeadServerAccess) { + new Exception().printStackTrace(); + } + cir.setReturnValue(new EmptyLevelChunk(this.level, new ChunkPos(chunkX, chunkZ))); + } + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index ae37e36b..78067ad7 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -15,6 +15,7 @@ "bugfix.refinedstorage.te_bug.FluidExternalStorageMixin", "bugfix.refinedstorage.te_bug.ItemExternalStorageCacheMixin", "bugfix.refinedstorage.te_bug.ItemExternalStorageMixin", + "bugfix.chunk_deadlock.ServerChunkCacheMixin", "perf.remove_biome_temperature_cache.BiomeMixin", "perf.resourcepacks.ModFileResourcePackMixin", "perf.resourcepacks.VanillaPackMixin",