From ced7f866d8394f73d24dd2dc42f47ff7eb3eb2f4 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 29 Oct 2023 21:14:51 -0400 Subject: [PATCH] Revert "Use copy-on-write map for permanent overrides" This solution is also not good enough. It causes catastrophic time complexity with mods that call get and put in rapid succession (i.e. every Forge mod using ModelBakeEvent) --- .../DynamicBakedModelProvider.java | 68 ++++++------------- 1 file changed, 19 insertions(+), 49 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index 5e7f2f63..456ceea7 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -2,7 +2,6 @@ package org.embeddedt.modernfix.dynamicresources; import com.google.common.collect.ImmutableSet; import com.mojang.math.Transformation; -import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; @@ -39,8 +38,7 @@ public class DynamicBakedModelProvider implements Map, BakedModel> bakedCache; - private volatile Map permanentOverridesView = null; - private final Map permanentOverridesMutable; + private final Map permanentOverrides; private BakedModel missingModel; private static final BakedModel SENTINEL = new BakedModel() { @Override @@ -87,7 +85,7 @@ public class DynamicBakedModelProvider implements Map, BakedModel> cache) { this.bakery = bakery; this.bakedCache = cache; - this.permanentOverridesMutable = new Object2ObjectOpenHashMap<>(); + this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>()); if(currentInstance == null) currentInstance = this; } @@ -109,27 +107,14 @@ public class DynamicBakedModelProvider implements Map getPermanentOverrides() { - Map map = permanentOverridesView; - if(map == null) { - synchronized (this) { - map = permanentOverridesView; - if(map == null) { - permanentOverridesView = map = Object2ObjectMaps.unmodifiable(new Object2ObjectOpenHashMap<>(permanentOverridesMutable)); - } - } - } - return map; - } - @Override public boolean containsKey(Object o) { - return getPermanentOverrides().getOrDefault(o, SENTINEL) != null; + return permanentOverrides.getOrDefault(o, SENTINEL) != null; } @Override public boolean containsValue(Object o) { - return getPermanentOverrides().containsValue(o) || bakedCache.containsValue(o); + return permanentOverrides.containsValue(o) || bakedCache.containsValue(o); } private static boolean isVanillaTopLevelModel(ResourceLocation location) { @@ -155,7 +140,7 @@ public class DynamicBakedModelProvider implements Map map) { - synchronized (this) { - permanentOverridesMutable.putAll(map); - permanentOverridesView = null; - } + permanentOverrides.putAll(map); } @Override @@ -236,27 +210,23 @@ public class DynamicBakedModelProvider implements Map function) { - synchronized (this) { - permanentOverridesMutable.replaceAll(function); - permanentOverridesView = null; - } + Set overridenLocations = permanentOverrides.keySet(); + permanentOverrides.replaceAll(function); boolean uvLock = BlockModelRotation.X0_Y0.isUvLocked(); Transformation rotation = BlockModelRotation.X0_Y0.getRotation(); bakedCache.replaceAll((loc, oldModel) -> { - if(loc.getMiddle() != rotation || loc.getRight() != uvLock || getPermanentOverrides().containsKey(loc.getLeft())) + if(loc.getMiddle() != rotation || loc.getRight() != uvLock || overridenLocations.contains(loc.getLeft())) return oldModel; else return function.apply(loc.getLeft(), oldModel);