Centralise instance locking logic

This commit is contained in:
Johannes Frohnmeyer 2022-01-04 12:51:51 +01:00
parent 0040e7bd65
commit dc312a94ad
Signed by: Johannes
GPG Key ID: E76429612C2929F4
8 changed files with 61 additions and 33 deletions

View File

@ -3,6 +3,7 @@ package io.gitlab.jfronny.inceptum.cli;
import io.gitlab.jfronny.inceptum.Inceptum;
import io.gitlab.jfronny.inceptum.install.Steps;
import io.gitlab.jfronny.inceptum.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.util.InceptumLockReader;
import io.gitlab.jfronny.inceptum.util.launch.ClientLauncher;
import io.gitlab.jfronny.inceptum.util.ProcessUtils;
import io.gitlab.jfronny.inceptum.util.Utils;
@ -48,20 +49,18 @@ public class LaunchCommand extends Command {
Inceptum.LOGGER.error("Not a valid instance");
return;
}
if (Files.exists(instanceDir.resolve("inceptum.setup.lock"))) {
if (InceptumLockReader.isSetupLocked(instanceDir)) {
Inceptum.LOGGER.error("This instance is still being set up");
return;
}
if (Files.exists(instanceDir.resolve("inceptum.lock"))) {
try {
if (ProcessUtils.isProcessAlive(Files.readString(instanceDir.resolve("inceptum.lock")))) {
Inceptum.LOGGER.error("This instance is already being ran");
return;
}
} catch (IOException e) {
Inceptum.showError("Could not read inceptum lock", e);
try {
if (InceptumLockReader.isRunningLocked(instanceDir)) {
Inceptum.LOGGER.error("This instance is already running");
return;
}
} catch (IOException e) {
Inceptum.showError("Could not read inceptum lock", e);
return;
}
InstanceMeta instance;
try {

View File

@ -6,6 +6,7 @@ import io.gitlab.jfronny.inceptum.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.model.inceptum.LoaderInfo;
import io.gitlab.jfronny.inceptum.model.mojang.VersionInfo;
import io.gitlab.jfronny.inceptum.model.mojang.VersionsListInfo;
import io.gitlab.jfronny.inceptum.util.InceptumLockReader;
import io.gitlab.jfronny.inceptum.util.ProcessUtils;
import io.gitlab.jfronny.inceptum.util.Utils;
import io.gitlab.jfronny.inceptum.util.api.FabricMetaApi;
@ -41,12 +42,7 @@ public class Steps {
}
public static void reDownload(Path instance) throws IOException {
if (Files.exists(instance.resolve("inceptum.setup.lock"))) return;
if (Files.exists(instance.resolve("inceptum.lock"))) {
if (ProcessUtils.isProcessAlive(Files.readString(instance.resolve("inceptum.lock")))) {
return;
} else Files.delete(instance.resolve("inceptum.lock"));
}
if (InceptumLockReader.isLocked(instance)) return;
InstanceMeta im = Utils.loadObject(instance.resolve("instance.json"), InstanceMeta.class);
boolean found = false;
for (VersionsListInfo version : McApi.getVersions().versions) {

View File

@ -5,6 +5,7 @@ import io.gitlab.jfronny.inceptum.install.SetupStepInfo;
import io.gitlab.jfronny.inceptum.install.Step;
import io.gitlab.jfronny.inceptum.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.model.inceptum.LoaderInfo;
import io.gitlab.jfronny.inceptum.util.InceptumLockReader;
import java.io.IOException;
import java.nio.file.Files;
@ -16,8 +17,8 @@ public class SetupDirsStep implements Step {
public void execute(SetupStepInfo info, AtomicBoolean stopThread) throws IOException {
info.setState("Setting up instance dirs");
Path iDir = Inceptum.INSTANCE_DIR.resolve(info.name());
InceptumLockReader.setSetupLock(iDir, true);
if (!Files.exists(iDir)) {
Files.createDirectories(iDir.resolve("inceptum.setup.lock"));
Files.createDirectories(iDir.resolve("resourcepacks"));
Files.createDirectories(iDir.resolve("saves"));
Files.createDirectories(iDir.resolve("screenshots"));

View File

@ -4,6 +4,7 @@ import io.gitlab.jfronny.inceptum.Inceptum;
import io.gitlab.jfronny.inceptum.install.SetupStepInfo;
import io.gitlab.jfronny.inceptum.install.Step;
import io.gitlab.jfronny.inceptum.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.util.InceptumLockReader;
import io.gitlab.jfronny.inceptum.util.Utils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
@ -22,8 +23,7 @@ public class WriteMetadataStep implements Step {
InstanceMeta meta = new InstanceMeta();
meta.version = info.version().id;
Utils.writeObject(metaDir, meta);
Path lock = instance.resolve("inceptum.setup.lock");
if (Files.exists(lock)) Files.delete(lock);
InceptumLockReader.setSetupLock(instance, false);
if (!Files.exists(instance.resolve(".gitignore"))) {
Files.writeString(instance.resolve(".gitignore"), """
realms_persistence.json

View File

@ -0,0 +1,38 @@
package io.gitlab.jfronny.inceptum.util;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class InceptumLockReader {
private static final String INCEPTUM_LOCK = "inceptum.lock";
private static final String INCEPTUM_SETUP_LOCK = "inceptum.setup.lock";
public static void setSetupLock(Path instancePath, boolean state) throws IOException {
if (isSetupLocked(instancePath)) {
if (!state) Files.delete(instancePath.resolve(INCEPTUM_SETUP_LOCK));
}
else {
if (state) Files.createDirectories(instancePath.resolve(INCEPTUM_SETUP_LOCK));
}
}
public static boolean isSetupLocked(Path instancePath) {
return Files.exists(instancePath.resolve(INCEPTUM_SETUP_LOCK));
}
public static void setRunningLock(Path instancePath, long pid) throws IOException {
Files.writeString(instancePath.resolve(INCEPTUM_LOCK), Long.toString(pid));
}
public static boolean isRunningLocked(Path instancePath) throws IOException {
if (!Files.exists(instancePath.resolve(INCEPTUM_LOCK))) return false;
if (ProcessUtils.isProcessAlive(Files.readString(instancePath.resolve(INCEPTUM_LOCK))))
return true;
Files.delete(instancePath.resolve(INCEPTUM_LOCK));
return false;
}
public static boolean isLocked(Path instancePath) throws IOException {
return isSetupLocked(instancePath) || isRunningLocked(instancePath);
}
}

View File

@ -9,10 +9,7 @@ import io.gitlab.jfronny.inceptum.model.inceptum.source.ModSource;
import io.gitlab.jfronny.inceptum.model.mojang.MinecraftArgument;
import io.gitlab.jfronny.inceptum.model.mojang.VersionInfo;
import io.gitlab.jfronny.inceptum.model.mojang.VersionsListInfo;
import io.gitlab.jfronny.inceptum.util.JvmUtils;
import io.gitlab.jfronny.inceptum.util.MetaHolder;
import io.gitlab.jfronny.inceptum.util.Utils;
import io.gitlab.jfronny.inceptum.util.VersionInfoLibraryResolver;
import io.gitlab.jfronny.inceptum.util.*;
import io.gitlab.jfronny.inceptum.util.api.FabricMetaApi;
import io.gitlab.jfronny.inceptum.util.api.McApi;
import io.gitlab.jfronny.inceptum.util.api.account.AuthInfo;
@ -122,7 +119,7 @@ public class InstanceLauncher {
Runnable starterRunner = () -> {
try {
proc.set(pb.start());
Files.writeString(instancePath.resolve("inceptum.lock"), Long.toString(proc.get().pid()));
InceptumLockReader.setRunningLock(instancePath, proc.get().pid());
} catch (IOException e) {
Inceptum.LOGGER.error("Could not start " + launchType.name, e);
}

View File

@ -85,7 +85,6 @@ public class InstanceEditWindow extends Window {
instance.java = customJavaPath.get();;
save();
}
ImGui.text("Did you know that every instance in Inceptum is a git repository?");
ImGui.endTabItem();
}
//TODO drag-and-drop mods

View File

@ -6,6 +6,7 @@ import io.gitlab.jfronny.inceptum.Inceptum;
import io.gitlab.jfronny.inceptum.InceptumGui;
import io.gitlab.jfronny.inceptum.install.Steps;
import io.gitlab.jfronny.inceptum.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.util.InceptumLockReader;
import io.gitlab.jfronny.inceptum.util.launch.ClientLauncher;
import io.gitlab.jfronny.inceptum.util.ProcessUtils;
import io.gitlab.jfronny.inceptum.util.Utils;
@ -20,7 +21,7 @@ public class InstanceView {
public static void draw(List<Path> paths) {
if (ImGui.beginTable("Instances", 2, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders)) {
for (Path path : paths) {
if (Files.exists(path.resolve("inceptum.setup.lock"))) {
if (InceptumLockReader.isSetupLocked(path)) {
ImGui.tableNextColumn();
ImGui.text("Setting up");
ImGui.tableNextColumn();
@ -40,14 +41,11 @@ public class InstanceView {
}
ImGui.tableNextColumn();
boolean disabled = false;
if (Files.exists(path.resolve("inceptum.lock"))) {
try {
if (ProcessUtils.isProcessAlive(Files.readString(path.resolve("inceptum.lock"))))
disabled = true;
else Files.delete(path.resolve("inceptum.lock"));
} catch (IOException e) {
continue;
}
try {
if (InceptumLockReader.isRunningLocked(path))
disabled = true;
} catch (IOException e) {
continue;
}
if (disabled) ImGui.beginDisabled();
if (ImGui.button(path.getFileName().toString())) {