Always invoke config initialisers

This resolves an issue where the worker threads were not
initialised if the config file did not exist already.
This commit is contained in:
Spottedleaf
2024-08-07 06:18:30 -07:00
parent 0dd063ecac
commit 2f97c1e3c3
6 changed files with 56 additions and 19 deletions

View File

@@ -0,0 +1,7 @@
package ca.spottedleaf.moonrise.common.config;
public interface InitialiseHook {
public void initialise();
}

View File

@@ -1,7 +0,0 @@
package ca.spottedleaf.moonrise.common.config;
public interface PostDeserializeHook {
public void deserialize();
}

View File

@@ -1,10 +1,9 @@
package ca.spottedleaf.moonrise.common.config.adapter;
import ca.spottedleaf.moonrise.common.config.PostDeserializeHook;
import ca.spottedleaf.moonrise.common.config.InitialiseHook;
import ca.spottedleaf.moonrise.common.config.adapter.collection.CollectionTypeAdapter;
import ca.spottedleaf.moonrise.common.config.adapter.collection.ListTypeAdapter;
import ca.spottedleaf.moonrise.common.config.adapter.collection.SortedMapTypeAdapter;
import ca.spottedleaf.moonrise.common.config.adapter.collection.UnsortedMapTypeAdapter;
import ca.spottedleaf.moonrise.common.config.adapter.primitive.BooleanTypeAdapter;
import ca.spottedleaf.moonrise.common.config.adapter.primitive.ByteTypeAdapter;
import ca.spottedleaf.moonrise.common.config.adapter.primitive.DoubleTypeAdapter;
@@ -32,7 +31,6 @@ import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public final class TypeAdapterRegistry {
@@ -117,6 +115,20 @@ public final class TypeAdapterRegistry {
return ret;
}
public <T> void callInitialisers(final T object) {
if (object == null) {
return;
}
final TypeAdapter<?, ?> adapter = this.getAdapter(object.getClass());
if (!(adapter instanceof AutoTypeAdapter<?> autoTypeAdapter)) {
return;
}
((AutoTypeAdapter<T>)autoTypeAdapter).callInitialisers(object);
}
private static final class AutoTypeAdapter<T> extends TypeAdapter<T, Map<Object, Object>> {
private final TypeAdapterRegistry registry;
@@ -229,10 +241,6 @@ public final class TypeAdapterRegistry {
field.field.set(ret, field.adapter.deserialize(registry, fieldValue, field.field.getGenericType()));
}
if (ret instanceof PostDeserializeHook hook) {
hook.deserialize();
}
return ret;
} catch (final Exception ex) {
throw new RuntimeException(ex);
@@ -267,6 +275,23 @@ public final class TypeAdapterRegistry {
return ret;
}
public void callInitialisers(final T value) {
for (final SerializableField field : this.fields) {
final Object fieldValue;
try {
fieldValue = field.field.get(value);
} catch (final Exception ex) {
throw new RuntimeException(ex);
}
if (fieldValue instanceof InitialiseHook initialiseHook) {
initialiseHook.initialise();
}
this.registry.callInitialisers(fieldValue);
}
}
}
public static final class CommentedData {

View File

@@ -131,6 +131,10 @@ public final class YamlConfig<T> {
return ret.append(this.saveToString()).toString();
}
public void callInitialisers() {
this.typeAdapters.callInitialisers(this.config);
}
private static final class YamlConstructor extends Constructor {
public YamlConstructor(final LoaderOptions loadingConfig) {

View File

@@ -1,6 +1,6 @@
package ca.spottedleaf.moonrise.common.config.moonrise;
import ca.spottedleaf.moonrise.common.config.PostDeserializeHook;
import ca.spottedleaf.moonrise.common.config.InitialiseHook;
import ca.spottedleaf.moonrise.common.config.annotation.Adaptable;
import ca.spottedleaf.moonrise.common.config.ui.ClothConfig;
import ca.spottedleaf.moonrise.common.config.annotation.Serializable;
@@ -147,7 +147,7 @@ public final class MoonriseConfig {
public WorkerPool workerPool = new WorkerPool();
@Adaptable
public static final class WorkerPool implements PostDeserializeHook {
public static final class WorkerPool implements InitialiseHook {
@Serializable(
comment = """
Set the number of shared worker threads to be used by chunk rendering,
@@ -163,7 +163,7 @@ public final class MoonriseConfig {
public int workerThreads = -1;
@Override
public void deserialize() {
public void initialise() {
MoonriseCommon.adjustWorkerThreads(this);
}
}
@@ -172,7 +172,7 @@ public final class MoonriseConfig {
public ChunkSystem chunkSystem = new ChunkSystem();
@Adaptable
public static final class ChunkSystem implements PostDeserializeHook {
public static final class ChunkSystem implements InitialiseHook {
@Serializable(
comment = """
@@ -205,7 +205,7 @@ public final class MoonriseConfig {
public boolean populationGenParallelism = false;
@Override
public void deserialize() {
public void initialise() {
ChunkTaskScheduler.init(this);
}
}

View File

@@ -117,6 +117,14 @@ public final class MoonriseCommon {
}
public static boolean reloadConfig() {
final boolean ret = reloadConfig0();
CONFIG.callInitialisers();
return ret;
}
private static boolean reloadConfig0() {
synchronized (CONFIG) {
if (CONFIG_FILE.exists()) {
try {