aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorGlease <4586901+Glease@users.noreply.github.com>2022-01-30 11:39:51 +0800
committerJason Mitchell <mitchej+github@gmail.com>2022-01-31 17:37:23 -0800
commite8a11aee55e070c16e2e96220cae67624ab58930 (patch)
tree6a2f40160685c571d70add79375dd8d8f9c9353b /src/main/java
parent707722fc829708527efee95937f5cb9e6b69a5d5 (diff)
downloadGT5-Unofficial-e8a11aee55e070c16e2e96220cae67624ab58930.tar.gz
GT5-Unofficial-e8a11aee55e070c16e2e96220cae67624ab58930.tar.bz2
GT5-Unofficial-e8a11aee55e070c16e2e96220cae67624ab58930.zip
Fix incorrect sorted recipe list caching
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
index 90a5d603d2..d6f339ec7f 100644
--- a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
+++ b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
@@ -28,19 +28,21 @@ import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.opengl.GL11;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
import java.awt.*;
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.Iterator;
import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
public class GT_NEI_DefaultHandler extends RecipeMapHandler {
public static final int sOffsetX = 5;
public static final int sOffsetY = 11;
- private int mCachedRecipesVersion = -1;
- private SoftReference<List<CachedDefaultRecipe>> mCachedRecipes = null;
+ private static final ConcurrentMap<GT_Recipe.GT_Recipe_Map, SortedRecipeListCache> CACHE = new ConcurrentHashMap<>();
static {
GuiContainerManager.addInputHandler(new GT_RectHandler());
@@ -60,8 +62,9 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
}
public List<CachedDefaultRecipe> getCache() {
+ SortedRecipeListCache cacheHolder = CACHE.computeIfAbsent(mRecipeMap, m -> new SortedRecipeListCache());
List<CachedDefaultRecipe> cache;
- if (mCachedRecipesVersion == GT_Mod.gregtechproxy.getReloadCount() || mCachedRecipes == null || (cache = mCachedRecipes.get()) == null) {
+ if (cacheHolder.getCachedRecipesVersion() != GT_Mod.gregtechproxy.getReloadCount() || (cache = cacheHolder.getCachedRecipes()) == null) {
cache = mRecipeMap.mRecipeList.stream() // do not use parallel stream. This is already parallelized by NEI
.filter(r -> !r.mHidden)
.sorted()
@@ -69,7 +72,9 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
.collect(Collectors.toList());
// while the NEI parallelize handlers, for each individual handler it still uses sequential execution model
// so we do not need any synchronization here
- mCachedRecipes = new SoftReference<>(cache);
+ // even if it does break, at worst case it's just recreating the cache multiple times, which should be fine
+ cacheHolder.setCachedRecipes(cache);
+ cacheHolder.setCachedRecipesVersion(GT_Mod.gregtechproxy.getReloadCount());
}
return cache;
}
@@ -882,4 +887,27 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
public String trans(String aKey, String aEnglish){
return GT_LanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_"+aKey, aEnglish, false);
}
+
+ private static class SortedRecipeListCache {
+ private int mCachedRecipesVersion = -1;
+ @Nullable
+ private SoftReference<List<CachedDefaultRecipe>> mCachedRecipes;
+
+ public int getCachedRecipesVersion() {
+ return mCachedRecipesVersion;
+ }
+
+ public void setCachedRecipesVersion(int aCachedRecipesVersion) {
+ this.mCachedRecipesVersion = aCachedRecipesVersion;
+ }
+
+ @Nullable
+ public List<CachedDefaultRecipe> getCachedRecipes() {
+ return mCachedRecipes == null ? null : mCachedRecipes.get();
+ }
+
+ public void setCachedRecipes(@Nonnull List<CachedDefaultRecipe> aCachedRecipes) {
+ this.mCachedRecipes = new SoftReference<>(aCachedRecipes);
+ }
+ }
}