From 572cbaf9bdd1540556c756cbdd5b5766d6c7cc56 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sat, 7 Jan 2023 19:03:47 -0500 Subject: [PATCH] Make BlockColors thread-safe Workaround for issues like https://github.com/vadis365/Mob-Grinding-Utils/issues/240, as too many mods do this --- .../core/config/ModernFixEarlyConfig.java | 1 + .../mixin/safety/BlockColorsMixin.java | 26 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 3 ++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/safety/BlockColorsMixin.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 5acc963c..c9a24ba7 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -32,6 +32,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("perf.preload_block_classes", true); this.addMixinRule("perf.parallel_potentially_unsafe", false); this.addMixinRule("perf.parallel_blockstate_cache_rebuild", true); + this.addMixinRule("safety", true); /* Mod compat */ if(FMLLoader.getLoadingModList().getModFileById("smoothboot") != null) { diff --git a/src/main/java/org/embeddedt/modernfix/mixin/safety/BlockColorsMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/safety/BlockColorsMixin.java new file mode 100644 index 00000000..1f675882 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/safety/BlockColorsMixin.java @@ -0,0 +1,26 @@ +package org.embeddedt.modernfix.mixin.safety; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.color.BlockColors; +import net.minecraft.client.renderer.color.IBlockColor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +@Mixin(value = BlockColors.class, priority = 700) +public class BlockColorsMixin { + private Lock mapLock = new ReentrantLock(); + @Inject(method = "register", at = @At("HEAD")) + private void lockMapBeforeAccess(IBlockColor pBlockColor, Block[] pBlocks, CallbackInfo ci) { + mapLock.lock(); + } + @Inject(method = "register", at = @At("TAIL")) + private void unlockMap(IBlockColor pBlockColor, Block[] pBlocks, CallbackInfo ci) { + mapLock.unlock(); + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index c13f303d..8b96d2d3 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -38,7 +38,8 @@ "perf.async_jei.JeiStarterMixin", "perf.async_jei.PluginCallerMixin", "perf.async_jei.RecipeManagerInternalMixin", - "perf.thread_priorities.IntegratedServerMixin" + "perf.thread_priorities.IntegratedServerMixin", + "safety.BlockColorsMixin" ], "injectors": { "defaultRequire": 1