aboutsummaryrefslogtreecommitdiff
path: root/runtime/src
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2023-08-09 03:23:39 +0800
committershedaniel <daniel@shedaniel.me>2023-08-09 04:02:35 +0800
commit1e1173c4227a3f0e6c7688ee5c5d533c9921dc50 (patch)
tree80c7e91683dd904b6532bff195dcf3d5ab2e2500 /runtime/src
parent67510af66585350b8794374d0932c07390fe5a8d (diff)
downloadRoughlyEnoughItems-1e1173c4227a3f0e6c7688ee5c5d533c9921dc50.tar.gz
RoughlyEnoughItems-1e1173c4227a3f0e6c7688ee5c5d533c9921dc50.tar.bz2
RoughlyEnoughItems-1e1173c4227a3f0e6c7688ee5c5d533c9921dc50.zip
Fix concurrency issues with recipe lookup
Diffstat (limited to 'runtime/src')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java12
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplaysHolderImpl.java7
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java30
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java14
4 files changed, 40 insertions, 23 deletions
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<REIClientPlugi
private final List<DynamicDisplayGenerator<?>> globalDisplayGenerators = new ArrayList<>();
private final List<DisplayVisibilityPredicate> visibilityPredicates = new ArrayList<>();
private final List<DisplayFiller<?>> 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<REIClientPlugi
@Override
public void add(Display display, @Nullable Object origin) {
if (!PluginManager.areAnyReloading()) {
- if (lastAddWarning != null) {
- if (lastAddWarning.getValue() > 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<Display> {
- private final List<Display> unmodifiableList;
private final List<Display> synchronizedList;
public DisplaysList() {
- this.synchronizedList = Collections.synchronizedList(this);
- this.unmodifiableList = Collections.unmodifiableList(synchronizedList);
+ List<Display> 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<P extends REIPlugin<?>> implements PluginManager<
@Override
public void pre(ReloadStage stage) {
+ this.reloading = stage;
List<PluginWrapper<P>> plugins = new ArrayList<>(getPluginWrapped().toList());
plugins.sort(Comparator.comparingDouble(PluginWrapper<P>::getPriority).reversed());
Collections.reverse(plugins);
@@ -260,8 +261,22 @@ public class PluginManagerImpl<P extends REIPlugin<?>> 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<P> 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<P extends REIPlugin<?>> implements PluginManager<
@Override
public void post(ReloadStage stage) {
+ this.reloading = stage;
List<PluginWrapper<P>> plugins = new ArrayList<>(getPluginWrapped().toList());
plugins.sort(Comparator.comparingDouble(PluginWrapper<P>::getPriority).reversed());
Collections.reverse(plugins);
@@ -296,8 +312,22 @@ public class PluginManagerImpl<P extends REIPlugin<?>> 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<P> 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);
}