mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-13 00:37:52 +00:00
Add support for caching of configuration values. (#7608)
This commit is contained in:
1 parent
ba15737fe3
commit
65bc41281f
3 files changed
+176
-1
No files matched your search
@@ -42,6 +42,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import org.apache.commons.lang3.tuple.Pair;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
|
||||
@@ -90,6 +91,7 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
|
||||
((FileConfig) config).save();
|
||||
}
|
||||
}
|
||||
this.afterReload();
|
||||
}
|
||||
|
||||
public boolean isCorrecting() {
|
||||
@@ -108,6 +110,22 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
|
||||
return this.values;
|
||||
}
|
||||
|
||||
public void afterReload() {
|
||||
this.resetCaches(getValues().valueMap().values());
|
||||
}
|
||||
|
||||
private void resetCaches(final Iterable<Object> configValues) {
|
||||
configValues.forEach(value -> {
|
||||
if (value instanceof ConfigValue) {
|
||||
final ConfigValue<?> configValue = (ConfigValue<?>) value;
|
||||
configValue.clearCache();
|
||||
} else if (value instanceof Config) {
|
||||
final Config innerConfig = (Config) value;
|
||||
this.resetCaches(innerConfig.valueMap().values());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void save()
|
||||
{
|
||||
Preconditions.checkNotNull(childConfig, "Cannot save config value without assigned Config object present");
|
||||
@@ -690,10 +708,15 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
|
||||
|
||||
public static class ConfigValue<T>
|
||||
{
|
||||
@VisibleForTesting
|
||||
static boolean USE_CACHES = true;
|
||||
|
||||
private final Builder parent;
|
||||
private final List<String> path;
|
||||
private final Supplier<T> defaultSupplier;
|
||||
|
||||
private T cachedValue = null;
|
||||
|
||||
private ForgeConfigSpec spec;
|
||||
|
||||
ConfigValue(Builder parent, List<String> path, Supplier<T> defaultSupplier)
|
||||
@@ -714,7 +737,13 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
|
||||
Preconditions.checkNotNull(spec, "Cannot get config value before spec is built");
|
||||
if (spec.childConfig == null)
|
||||
return defaultSupplier.get();
|
||||
return getRaw(spec.childConfig, path, defaultSupplier);
|
||||
|
||||
if (USE_CACHES && cachedValue == null)
|
||||
cachedValue = getRaw(spec.childConfig, path, defaultSupplier);
|
||||
else if (!USE_CACHES)
|
||||
return getRaw(spec.childConfig, path, defaultSupplier);
|
||||
|
||||
return cachedValue;
|
||||
}
|
||||
|
||||
protected T getRaw(Config config, List<String> path, Supplier<T> defaultSupplier)
|
||||
@@ -739,6 +768,11 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper<UnmodifiableConfi
|
||||
Preconditions.checkNotNull(spec, "Cannot set config value before spec is built");
|
||||
Preconditions.checkNotNull(spec.childConfig, "Cannot set config value without assigned Config object present");
|
||||
spec.childConfig.set(path, value);
|
||||
this.cachedValue = value;
|
||||
}
|
||||
|
||||
public void clearCache() {
|
||||
this.cachedValue = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -156,6 +156,7 @@ public class ConfigFileTypeHandler {
|
||||
throw new ConfigLoadingException(modConfig, ex);
|
||||
}
|
||||
LOGGER.debug(CONFIG, "Config file {} changed, sending notifies", this.modConfig.getFileName());
|
||||
this.modConfig.getSpec().afterReload();
|
||||
this.modConfig.fireEvent(new ModConfig.Reloading(this.modConfig));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user