Skip to content

Commit

Permalink
fix EarlyConfig NPE from race conditions
Browse files Browse the repository at this point in the history
  • Loading branch information
FalsePattern committed Oct 3, 2024
1 parent 6d82ff2 commit f725bb5
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 16 deletions.
54 changes: 42 additions & 12 deletions src/main/java/com/falsepattern/lib/internal/config/EarlyConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,21 @@
package com.falsepattern.lib.internal.config;

import com.falsepattern.lib.StableAPI;
import com.falsepattern.lib.internal.FalsePatternLib;
import com.falsepattern.lib.internal.Tags;
import com.falsepattern.lib.internal.core.LowLevelCallMultiplexer;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
import lombok.Data;
import lombok.SneakyThrows;
import lombok.experimental.Accessors;
import lombok.val;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;

Expand All @@ -43,22 +50,45 @@ public class EarlyConfig {
@StableAPI.Expose(since = "__INTERNAL__")
private boolean enableLibraryDownloads;

private static EarlyConfig instance = null;
private static volatile EarlyConfig instance = null;

@SneakyThrows
public static EarlyConfig load() {
if (instance != null)
return instance;
val configFile = LowLevelCallMultiplexer.gameDir().resolve("config").resolve("falsepatternlib-early.json");
val gson = new Gson();
EarlyConfig config;
if (!Files.exists(configFile)) {
private static final Logger LOG = LogManager.getLogger(Tags.MODNAME + " Early Config");

public static @NotNull EarlyConfig getInstance() {
val config = instance;
if (config != null)
return config;
return loadFromDisk();
}

private static synchronized @NotNull EarlyConfig loadFromDisk() {
var config = instance;
if (config != null) {
return config;
}
val configDir = LowLevelCallMultiplexer.gameDir().resolve("config");
val configFile = configDir.resolve("falsepatternlib-early.json");
val gson = new GsonBuilder().setPrettyPrinting().create();
try {
if (!Files.exists(configDir)) {
Files.createDirectories(configDir);
}
if (Files.exists(configFile)) {
config = gson.fromJson(new String(Files.readAllBytes(configFile), StandardCharsets.UTF_8),
EarlyConfig.class);
}
} catch (IOException e) {
LOG.error("Failed to load from disk", e);
}
if (config == null) {
config = new EarlyConfig();
config.enableLibraryDownloads(true);
} else {
config = gson.fromJson(new String(Files.readAllBytes(configFile), StandardCharsets.UTF_8), EarlyConfig.class);
try {
Files.write(configFile, gson.toJson(config).getBytes(StandardCharsets.UTF_8));
} catch (IOException e) {
LOG.error("Failed to write to disk", e);
}
}
Files.write(configFile, gson.toJson(config).getBytes(StandardCharsets.UTF_8));
instance = config;
return config;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import com.gtnewhorizons.retrofuturabootstrap.RfbApiImpl;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;

import net.minecraft.launchwrapper.Launch;

Expand Down Expand Up @@ -56,7 +57,7 @@ public static List<URL> getClassPathSources() {
}
}

public static Path gameDir() {
public static @NotNull Path gameDir() {
if (rfbDetected) {
return RFBLowLevel.gameDir();
} else {
Expand All @@ -76,7 +77,7 @@ static List<URL> getClassPathSources() {
return RfbApiImpl.INSTANCE.compatClassLoader().getSources();
}

static Path gameDir() {
static @NotNull Path gameDir() {
return RfbApiImpl.INSTANCE.gameDirectory();
}
}
Expand All @@ -90,7 +91,7 @@ static List<URL> getClassPathSources() {
return Launch.classLoader.getSources();
}

static Path gameDir() {
static @NotNull Path gameDir() {
return Launch.minecraftHome == null ? Paths.get(".") : Launch.minecraftHome.toPath();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -805,7 +805,7 @@ private boolean tryLoadingExistingFile() {
}

private void validateDownloadsAllowed() {
if (!EarlyConfig.load().enableLibraryDownloads()) {
if (!EarlyConfig.getInstance().enableLibraryDownloads()) {
val errorMessage = "Failed to load library "
+ groupId
+ ":"
Expand Down

0 comments on commit f725bb5

Please sign in to comment.