From 82a6701f795a883d80c3b0167b4d3f3e224a5cd8 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 28 Dec 2017 10:13:53 +0100 Subject: [PATCH] Optionally delete savestate that gets loaded at boot --- .../dolphinemu/dolphinemu/NativeLibrary.java | 2 +- Source/Android/jni/MainAndroid.cpp | 18 ++++++++++------- Source/Core/Core/Boot/Boot.h | 1 + Source/Core/Core/Core.cpp | 20 +++++++++++++------ 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index 0d55f9bb12..e82de7fa01 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -343,7 +343,7 @@ public final class NativeLibrary /** * Begins emulation from the specified savestate. */ - public static native void Run(String path, String savestatePath); + public static native void Run(String path, String savestatePath, boolean deleteSavestate); // Surface Handling public static native void SurfaceChanged(Surface surf); diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index c4ab13f59c..b1bd33093c 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "ButtonManager.h" @@ -482,8 +483,8 @@ Java_org_dolphinemu_dolphinemu_NativeLibrary_CacheClassesAndMethods(JNIEnv* env, JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2( JNIEnv* env, jobject obj, jstring jFile); JNIEXPORT void JNICALL -Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2( - JNIEnv* env, jobject obj, jstring jFile, jstring jSavestate); +Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z( + JNIEnv* env, jobject obj, jstring jFile, jstring jSavestate, jboolean jDeleteSavestate); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SurfaceChanged(JNIEnv* env, jobject obj, jobject surf); @@ -805,7 +806,8 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_RefreshWiimo WiimoteReal::Refresh(); } -static void Run(const std::string& path, std::optional savestate_path = {}) +static void Run(const std::string& path, std::optional savestate_path = {}, + bool delete_savestate = false) { __android_log_print(ANDROID_LOG_INFO, DOLPHIN_TAG, "Running : %s", path.c_str()); @@ -823,7 +825,9 @@ static void Run(const std::string& path, std::optional savestate_pa // No use running the loop when booting fails s_have_wm_user_stop = false; - if (BootManager::BootCore(BootParameters::GenerateFromFile(path, savestate_path))) + std::unique_ptr boot = BootParameters::GenerateFromFile(path, savestate_path); + boot->delete_savestate = delete_savestate; + if (BootManager::BootCore(std::move(boot))) { static constexpr int TIMEOUT = 10000; static constexpr int WAIT_STEP = 25; @@ -861,10 +865,10 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_l } JNIEXPORT void JNICALL -Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2( - JNIEnv* env, jobject obj, jstring jFile, jstring jSavestate) +Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z( + JNIEnv* env, jobject obj, jstring jFile, jstring jSavestate, jboolean jDeleteSavestate) { - Run(GetJString(env, jFile), GetJString(env, jSavestate)); + Run(GetJString(env, jFile), GetJString(env, jSavestate), jDeleteSavestate); } #ifdef __cplusplus diff --git a/Source/Core/Core/Boot/Boot.h b/Source/Core/Core/Boot/Boot.h index 7581b2abb8..a6b7391b44 100644 --- a/Source/Core/Core/Boot/Boot.h +++ b/Source/Core/Core/Boot/Boot.h @@ -76,6 +76,7 @@ struct BootParameters Parameters parameters; std::optional savestate_path; + bool delete_savestate = false; }; class CBoot diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 1d77f4e2fc..500885ffbb 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -318,7 +318,7 @@ static void CPUSetInitialExecutionState() } // Create the CPU thread, which is a CPU + Video thread in Single Core mode. -static void CpuThread(const std::optional& savestate_path) +static void CpuThread(const std::optional& savestate_path, bool delete_savestate) { DeclareAsCPUThread(); @@ -342,7 +342,13 @@ static void CpuThread(const std::optional& savestate_path) EMM::InstallExceptionHandler(); // Let's run under memory watch if (savestate_path) - QueueHostJob([&savestate_path] { ::State::LoadAs(*savestate_path); }); + { + QueueHostJob([&savestate_path, delete_savestate] { + ::State::LoadAs(*savestate_path); + if (delete_savestate) + File::Delete(*savestate_path); + }); + } s_is_started = true; CPUSetInitialExecutionState(); @@ -380,7 +386,8 @@ static void CpuThread(const std::optional& savestate_path) EMM::UninstallExceptionHandler(); } -static void FifoPlayerThread(const std::optional& savestate_path) +static void FifoPlayerThread(const std::optional& savestate_path, + bool delete_savestate) { DeclareAsCPUThread(); const SConfig& _CoreParameter = SConfig::GetInstance(); @@ -517,6 +524,7 @@ static void EmuThread(std::unique_ptr boot) } const std::optional savestate_path = boot->savestate_path; + const bool delete_savestate = boot->delete_savestate; // Load and Init Wiimotes - only if we are booting in Wii mode if (core_parameter.bWii && !SConfig::GetInstance().m_bt_passthrough_enabled) @@ -556,7 +564,7 @@ static void EmuThread(std::unique_ptr boot) PowerPC::SetMode(PowerPC::CoreMode::Interpreter); // Determine the CPU thread function - void (*cpuThreadFunc)(const std::optional& savestate_path); + void (*cpuThreadFunc)(const std::optional& savestate_path, bool delete_savestate); if (std::holds_alternative(boot->parameters)) cpuThreadFunc = FifoPlayerThread; else @@ -597,7 +605,7 @@ static void EmuThread(std::unique_ptr boot) Host_Message(WM_USER_CREATE); // Spawn the CPU thread - s_cpu_thread = std::thread(cpuThreadFunc, savestate_path); + s_cpu_thread = std::thread(cpuThreadFunc, savestate_path, delete_savestate); // become the GPU thread Fifo::RunGpuLoop(); @@ -615,7 +623,7 @@ static void EmuThread(std::unique_ptr boot) Common::SetCurrentThreadName("Emuthread - Idle"); // Spawn the CPU+GPU thread - s_cpu_thread = std::thread(cpuThreadFunc, savestate_path); + s_cpu_thread = std::thread(cpuThreadFunc, savestate_path, delete_savestate); while (CPU::GetState() != CPU::State::PowerDown) {