[BUG] Fix Config watcher using too many threads and not detecting changes on Linux systems

This commit is contained in:
2025-03-13 14:58:15 +02:00
parent 15b9b40b0e
commit b800a4ea78
6 changed files with 20 additions and 18 deletions

View File

@@ -8,6 +8,7 @@ import org.jetbrains.annotations.ApiStatus;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
/**
* @author HypherionSA
@@ -19,7 +20,9 @@ public final class ConfigController implements Serializable {
* Cache of registered configs
*/
@Getter
private static final HashMap<String, Pair<AbstractConfig, FileWatcher>> watchedConfigs = new HashMap<>();
private static final HashMap<String, AbstractConfig> watchedConfigs = new HashMap<>();
private static FileWatcher watcher = new FileWatcher(e -> CraterConstants.LOG.error("Config Watcher Error", e));
/**
* INTERNAL METHOD - Register and watch the config
@@ -42,9 +45,8 @@ public final class ConfigController implements Serializable {
if (watchedConfigs.containsKey(config.getConfigPath().toString())) {
CraterConstants.LOG.error("Failed to register {}. Config already registered", config.getConfigPath().getName());
} else {
FileWatcher configWatcher = new FileWatcher();
try {
configWatcher.setWatch(config.getConfigPath(), () -> {
watcher.addWatch(config.getConfigPath(), () -> {
if (!config.isWasSaveCalled()) {
CraterConstants.LOG.info("Sending Reload Event for: {}", config.getConfigPath().getName());
config.configReloaded();
@@ -53,7 +55,7 @@ public final class ConfigController implements Serializable {
} catch (Exception e) {
CraterConstants.LOG.error("Failed to register {} for auto reloading. {}", config.getConfigPath().getName(), e.getMessage());
}
watchedConfigs.put(config.getConfigPath().toString(), Pair.of(config, configWatcher));
watchedConfigs.put(config.getConfigPath().toString(), config);
CraterConstants.LOG.info("Registered {} successfully!", config.getConfigPath().getName());
}
}

View File

@@ -1,8 +1,6 @@
package com.hypherionmc.craterlib;
import com.hypherionmc.craterlib.client.gui.config.ClothConfigScreenBuilder;
import com.hypherionmc.craterlib.client.gui.config.CraterConfigScreen;
import com.hypherionmc.craterlib.core.config.AbstractConfig;
import com.hypherionmc.craterlib.core.config.ConfigController;
import com.hypherionmc.craterlib.core.config.annotations.ClothScreen;
import com.hypherionmc.craterlib.core.config.annotations.NoConfigScreen;
@@ -27,12 +25,11 @@ public class CraterLibModMenuIntegration implements ModMenuApi {
public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
Map<String, ConfigScreenFactory<?>> configScreens = new HashMap<>();
ConfigController.getWatchedConfigs().forEach((conf, watcher) -> {
AbstractConfig config = watcher.getLeft();
ConfigController.getWatchedConfigs().forEach((conf, config) -> {
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
return;
if (watcher.getLeft().getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) {
if (config.getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) {
configScreens.put(config.getModId(), screen -> ClothConfigScreenBuilder.buildConfigScreen(config, screen));
} else {
configScreens.put(config.getModId(), screen -> BridgedMinecraft.getInstance().buildWarningScreen(

View File

@@ -28,12 +28,11 @@ public class ConfigScreenHandlerMixin {
*/
@Inject(at = @At("RETURN"), method = "getScreenFactoryFor", cancellable = true, remap = false)
private static void injectConfigScreen(IModInfo selectedMod, CallbackInfoReturnable<Optional<BiFunction<Minecraft, Screen, Screen>>> cir) {
ConfigController.getMonitoredConfigs().forEach((conf, watcher) -> {
AbstractConfig config = watcher.getLeft();
ConfigController.getMonitoredConfigs().forEach((conf, config) -> {
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
return;
if (watcher.getLeft().getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) {
if (config.getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) {
ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> ClothConfigScreenBuilder.buildConfigScreen(config, screen))));
} else {
//ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen))));

View File

@@ -54,12 +54,11 @@ public class NeoForgeClientHelper implements ClientPlatform {
LateInitEvent event = new LateInitEvent(new BridgedMinecraft(), BridgedOptions.of(Minecraft.getInstance().options));
CraterEventBus.INSTANCE.postEvent(event);
ConfigController.getWatchedConfigs().forEach((conf, watcher) -> {
AbstractConfig config = watcher.getLeft();
ConfigController.getWatchedConfigs().forEach((conf, config) -> {
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
return;
if (watcher.getLeft().getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) {
if (config.getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) {
ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> ClothConfigScreenBuilder.buildConfigScreen(config, screen))));
} else {
//ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen))));

View File

@@ -1,7 +1,12 @@
**Bug Fixes**:
- Fixed LuckPerms breaking commands on Paper
- Fix Config watcher using too many threads and not detecting changes on Linux systems
**New Features**:
- Added Nojang API to allow mods to access GameRules (SDLink)
**Dev Changes**:
- Bumped MoonConfig - `1.0.10` -> `1.0.11`

View File

@@ -2,7 +2,7 @@
version_major=2
version_minor=1
version_patch=4
version_build=0
version_build=1
#Mod
mod_author=HypherionSA
@@ -24,7 +24,7 @@ forge_version=50.0.6
neoforge_version=16-beta
# Dependencies
moon_config=1.0.10
moon_config=1.0.11
lombok=1.18.32
adventure=4.17.0
rpc_sdk=1.0