commit 86404c9b380b78321aa48c0dfd3269a27ea75147
parent d8e98d575bca8cca12c3cfa163ec89cb2abee5fd
Author: rhunk <101876869+rhunk@users.noreply.github.com>
Date:   Thu, 27 Jun 2024 23:33:32 +0200

fix(common/config): concurrent load

Signed-off-by: rhunk <101876869+rhunk@users.noreply.github.com>

Diffstat:
Mcommon/src/main/kotlin/me/rhunk/snapenhance/common/config/ModConfig.kt | 46++++++++++++++++++++++++++--------------------
1 file changed, 26 insertions(+), 20 deletions(-)

diff --git a/common/src/main/kotlin/me/rhunk/snapenhance/common/config/ModConfig.kt b/common/src/main/kotlin/me/rhunk/snapenhance/common/config/ModConfig.kt @@ -34,41 +34,47 @@ class ModConfig( private fun createRootConfig() = RootConfig().apply { lateInit(context) } fun load() { - root = createRootConfig() wasPresent = fileWrapper.exists() - if (!wasPresent) { - writeConfig() - return - } - - runCatching { - loadConfig() - }.onFailure { - writeConfig() + root = createRootConfig().apply { + if (!wasPresent) { + writeConfigObject(this) + return@apply + } + runCatching { + loadConfig(this) + }.onFailure { + writeConfigObject(this) + } } } - private fun loadConfig() { + private fun loadConfig(config: RootConfig) { val configFileContent = fileWrapper.readBytes() val configObject = gson.fromJson(configFileContent.toString(Charsets.UTF_8), JsonObject::class.java) locale = configObject.get("_locale")?.asString ?: LocaleWrapper.DEFAULT_LOCALE - root.fromJson(configObject) + config.fromJson(configObject) } fun exportToString( - exportSensitiveData: Boolean = true + exportSensitiveData: Boolean = true, + config: RootConfig = root, ): String { - val configObject = root.toJson(exportSensitiveData) - configObject.addProperty("_locale", locale) - return gson.toJson(configObject) + return gson.toJson(config.toJson(exportSensitiveData).apply { + addProperty("_locale", locale) + }) } fun reset() { - root = RootConfig() - writeConfig() + root = RootConfig().apply { + writeConfigObject(this) + } } fun writeConfig() { + writeConfigObject(root) + } + + private fun writeConfigObject(config: RootConfig) { var shouldRestart = false var shouldCleanCache = false var configChanged = false @@ -105,13 +111,13 @@ class ModConfig( } val oldConfig = runCatching { fileWrapper.readBytes().toString(Charsets.UTF_8) }.getOrNull() - fileWrapper.writeBytes(exportToString().toByteArray(Charsets.UTF_8)) + fileWrapper.writeBytes(exportToString(config = config).toByteArray(Charsets.UTF_8)) configStateListener?.also { runCatching { compareDiff(createRootConfig().apply { fromJson(gson.fromJson(oldConfig ?: return@runCatching, JsonObject::class.java)) - }, root) + }, config) if (configChanged) { it.onConfigChanged()