From 1e1173c4227a3f0e6c7688ee5c5d533c9921dc50 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 9 Aug 2023 03:23:39 +0800 Subject: Fix concurrency issues with recipe lookup --- .../registry/display/DisplayRegistryImpl.java | 12 ++++----- .../registry/display/DisplaysHolderImpl.java | 7 +++-- .../rei/impl/common/plugins/PluginManagerImpl.java | 30 ++++++++++++++++++++++ .../runtime/PluginStageExecutionWatcher.java | 14 ++-------- 4 files changed, 40 insertions(+), 23 deletions(-) (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java index 1aff7f720..f8f303408 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java @@ -39,7 +39,6 @@ import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.common.registry.RecipeManagerContextImpl; import net.minecraft.world.item.crafting.Recipe; -import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -53,7 +52,7 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl> globalDisplayGenerators = new ArrayList<>(); private final List visibilityPredicates = new ArrayList<>(); private final List> fillers = new ArrayList<>(); - private final MutableLong lastAddWarning = new MutableLong(-1); + private long lastAddWarning = -1; private DisplaysHolder displaysHolder = new DisplaysHolderImpl(false); public DisplayRegistryImpl() { @@ -73,12 +72,11 @@ public class DisplayRegistryImpl extends RecipeManagerContextImpl 0 && System.currentTimeMillis() - lastAddWarning.getValue() > 5000) { - InternalLogger.getInstance().warn("Detected runtime DisplayRegistry modification, this can be extremely dangerous!"); - } - lastAddWarning.setValue(System.currentTimeMillis()); + if (lastAddWarning < 0 || System.currentTimeMillis() - lastAddWarning > 5000) { + InternalLogger.getInstance().warn("Detected runtime DisplayRegistry modification, this can be extremely dangerous!"); + InternalLogger.getInstance().debug("Detected runtime DisplayRegistry modification, this can be extremely dangerous!", new Throwable()); } + lastAddWarning = System.currentTimeMillis(); } this.displaysHolder.add(display, origin); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplaysHolderImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplaysHolderImpl.java index b2bdce14d..bf09618c7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplaysHolderImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplaysHolderImpl.java @@ -64,7 +64,7 @@ public class DisplaysHolderImpl implements DisplaysHolder { if (list == null) { return null; } else { - return ((DisplaysList) list).unmodifiableList; + return ((DisplaysList) list).synchronizedList; } }, key -> CategoryRegistry.getInstance().tryGet(key).isPresent()); this.displaysByInput = createSetMultimap(); @@ -183,12 +183,11 @@ public class DisplaysHolderImpl implements DisplaysHolder { } private static class DisplaysList extends ArrayList { - private final List unmodifiableList; private final List synchronizedList; public DisplaysList() { - this.synchronizedList = Collections.synchronizedList(this); - this.unmodifiableList = Collections.unmodifiableList(synchronizedList); + List unmodifiableList = Collections.unmodifiableList(this); + this.synchronizedList = Collections.synchronizedList(unmodifiableList); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java index bd181824d..d5140f2c8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java @@ -231,6 +231,7 @@ public class PluginManagerImpl

> implements PluginManager< @Override public void pre(ReloadStage stage) { + this.reloading = stage; List> plugins = new ArrayList<>(getPluginWrapped().toList()); plugins.sort(Comparator.comparingDouble(PluginWrapper

::getPriority).reversed()); Collections.reverse(plugins); @@ -260,8 +261,22 @@ public class PluginManagerImpl

> implements PluginManager< } }); } catch (Throwable throwable) { + this.reloading = null; new RuntimeException("Failed to run pre registration").printStackTrace(); } + try (SectionClosable preStageAll = section(stage, "pre-stage/"); + PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Pre Stage " + stage.name())) { + for (Reloadable

reloadable : reloadables) { + Class reloadableClass = reloadable.getClass(); + try (SectionClosable preStage = section(stage, "pre-stage/" + name(reloadableClass) + "/"); + PerformanceLogger.Plugin.Inner inner = perfLogger.stage(name(reloadableClass))) { + reloadable.preStage(stage); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + this.reloading = null; this.reloadStopwatch.stop(); InternalLogger.getInstance().debug("========================================"); InternalLogger.getInstance().debug(name(pluginClass) + " finished pre-reload for " + stage + " in " + reloadStopwatch + "."); @@ -270,6 +285,7 @@ public class PluginManagerImpl

> implements PluginManager< @Override public void post(ReloadStage stage) { + this.reloading = stage; List> plugins = new ArrayList<>(getPluginWrapped().toList()); plugins.sort(Comparator.comparingDouble(PluginWrapper

::getPriority).reversed()); Collections.reverse(plugins); @@ -296,8 +312,22 @@ public class PluginManagerImpl

> implements PluginManager< } }); } catch (Throwable throwable) { + this.reloading = null; new RuntimeException("Failed to run post registration").printStackTrace(); } + try (SectionClosable postStageAll = section(stage, "post-stage/"); + PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Pre Stage " + stage.name())) { + for (Reloadable

reloadable : reloadables) { + Class reloadableClass = reloadable.getClass(); + try (SectionClosable postStage = section(stage, "post-stage/" + name(reloadableClass) + "/"); + PerformanceLogger.Plugin.Inner inner = perfLogger.stage(name(reloadableClass))) { + reloadable.postStage(stage); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + this.reloading = null; this.reloadStopwatch.stop(); postStopwatch.stop(); InternalLogger.getInstance().debug("========================================"); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java index 539d7ab76..f579ebdad 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java @@ -69,13 +69,10 @@ public class PluginStageExecutionWatcher implements HintProvider { @Override public void startReload() { - for (ReloadStage stage : ReloadStage.values()) { - startReload(stage); - } } @Override - public void startReload(ReloadStage stage) { + public void preStage(ReloadStage stage) { synchronized (allStages) { if (manager == PluginManager.getInstance() && stage.ordinal() == 0) { allStages.clear(); @@ -85,14 +82,7 @@ public class PluginStageExecutionWatcher implements HintProvider { } @Override - public void endReload() { - for (ReloadStage stage : ReloadStage.values()) { - endReload(stage); - } - } - - @Override - public void endReload(ReloadStage stage) { + public void postStage(ReloadStage stage) { synchronized (allStages) { data().finishedStages.add(stage); } -- cgit From 29f299d47269a1e2c9c2a9536f9a1fc755624473 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 9 Aug 2023 03:24:02 +0800 Subject: Fix plugin names in performance screen --- .../client/gui/performance/PerformanceScreen.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java index 420e122a5..2125e502a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java @@ -147,7 +147,7 @@ public class PerformanceScreen extends Screen { RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.getStages().forEach((stage, inner) -> { List entries = new ArrayList<>(); inner.times().forEach((obj, time) -> { - entries.add(new PerformanceEntryImpl(Component.literal(obj instanceof Pair ? ((Pair, REIPlugin>) obj).getFirst().getPluginProviderName() : Objects.toString(obj)), time)); + entries.add(new PerformanceEntryImpl(Component.literal(obj instanceof Pair ? getNameOfPlugin(obj) : Objects.toString(obj)), time)); }); Collection values = inner.times().values(); long separateTime; @@ -165,6 +165,24 @@ public class PerformanceScreen extends Screen { addWidget(list); } + private String getNameOfPlugin(Object obj) { + Pair, REIPlugin> pair = (Pair, REIPlugin>) obj; + REIPluginProvider provider = pair.getFirst(); + REIPlugin plugin = pair.getSecond(); + + String providerName = provider.getPluginProviderName(); + + if (provider.provide().size() >= 1) { + String pluginName = plugin.getPluginProviderName(); + + if (!providerName.equals(pluginName)) { + providerName = pluginName + " of " + providerName; + } + } + + return providerName; + } + @Override public void render(PoseStack poses, int mouseX, int mouseY, float delta) { renderDirtBackground(0); -- cgit From cacb4b646a0a96869cdb69dd08deb9d9900b35fa Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 9 Aug 2023 04:01:53 +0800 Subject: Improve performance on views lookup for ~20% --- runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java | 3 ++- .../rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'runtime/src/main/java/me') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index 97bb8ef83..ac8454a60 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -223,6 +223,7 @@ public class ViewsImpl implements Views { class Wrapped implements DisplaySpec { private Display display; private List ids = null; + private final int hash = merger.hashOf(display); public Wrapped(Display display) { this.display = display; @@ -238,7 +239,7 @@ public class ViewsImpl implements Views { @Override public int hashCode() { - return merger.hashOf(display); + return hash; } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java index 3d6348539..bb04d5f9e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java @@ -57,7 +57,7 @@ public class FilteredStacksVisibilityHandler implements DisplayVisibilityPredica @Override public EventResult handleDisplay(DisplayCategory category, Display display) { if (checkHiddenStacks) { - return visible.computeBooleanIfAbsent(display, displayPredicate) ? EventResult.pass() : EventResult.interruptFalse(); + return visible.computeIfAbsent(display, displayPredicate) ? EventResult.pass() : EventResult.interruptFalse(); } return EventResult.pass(); -- cgit