From 3bbca4cf59a74c17fa5398136ccd5b141db4704a Mon Sep 17 00:00:00 2001 From: izzy2lost Date: Wed, 11 Mar 2026 23:20:25 -0400 Subject: [PATCH] set release more like debug --- android/app/build.gradle.kts | 6 ++-- android/app/src/main/cpp/CMakeLists.txt | 6 ---- android/app/src/main/cpp/xemu_android.cpp | 8 +++++ .../app/src/main/cpp/xemu_settings_android.cc | 13 +++++--- .../java/com/izzy2lost/x1box/MainActivity.kt | 32 ++++++++++++++++++- 5 files changed, 50 insertions(+), 15 deletions(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 4c4d0e405e..c12b9e1d8e 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -44,10 +44,8 @@ android { "-DXEMU_ENABLE_XISO_CONVERTER=ON", "-DCMAKE_C_FLAGS_DEBUG=-O2 -g0", "-DCMAKE_CXX_FLAGS_DEBUG=-O2 -g0", - "-DCMAKE_C_FLAGS_RELEASE=-O2 -g0 -march=armv8-a -ffunction-sections -fdata-sections", - "-DCMAKE_CXX_FLAGS_RELEASE=-O2 -g0 -march=armv8-a -ffunction-sections -fdata-sections", - "-DCMAKE_EXE_LINKER_FLAGS_RELEASE=-Wl,--gc-sections", - "-DCMAKE_SHARED_LINKER_FLAGS_RELEASE=-Wl,--gc-sections" + "-DCMAKE_C_FLAGS_RELEASE=-O2 -g0", + "-DCMAKE_CXX_FLAGS_RELEASE=-O2 -g0" ) cppFlags += listOf("-std=c++17", "-fexceptions", "-frtti") } diff --git a/android/app/src/main/cpp/CMakeLists.txt b/android/app/src/main/cpp/CMakeLists.txt index 8d66c318d3..f3d39cf0b5 100644 --- a/android/app/src/main/cpp/CMakeLists.txt +++ b/android/app/src/main/cpp/CMakeLists.txt @@ -867,7 +867,6 @@ target_compile_definitions(xemu_core PRIVATE target_compile_options(xemu_core PRIVATE -g0 $<$,$,$>:-UNDEBUG> - $<$,$>:-O2 -march=armv8-a -ffunction-sections -fdata-sections> ) target_include_directories(xemu_core PRIVATE @@ -937,11 +936,6 @@ endif() target_compile_options(xemu PRIVATE -fexceptions -frtti -g0 $<$,$,$>:-UNDEBUG> - $<$,$>:-O2 -march=armv8-a -ffunction-sections -fdata-sections> -) - -target_link_options(xemu PRIVATE - $<$,$,$>:-Wl,--gc-sections> ) target_include_directories(xemu PRIVATE diff --git a/android/app/src/main/cpp/xemu_android.cpp b/android/app/src/main/cpp/xemu_android.cpp index 81a3f96e17..d95a1b2b4c 100644 --- a/android/app/src/main/cpp/xemu_android.cpp +++ b/android/app/src/main/cpp/xemu_android.cpp @@ -10,6 +10,7 @@ #include #include +#include #include #include #include @@ -35,6 +36,7 @@ extern "C" AddfdInfo* monitor_fdset_add_fd(int fd, bool has_fdset_id, namespace { constexpr const char* kLogTag = "xemu-android"; constexpr const char* kPrefsName = "x1box_prefs"; +static std::atomic g_qemu_init_started{false}; static JNIEnv* GetEnv(); static jobject GetActivity(JNIEnv* env); @@ -1039,8 +1041,14 @@ static int SDLCALL QemuThreadMain(void* data) { } extern "C" int xemu_android_main(int argc, char** argv) { + bool expected = false; + if (!g_qemu_init_started.compare_exchange_strong(expected, true)) { + LogError("xemu_android_main: qemu_init re-entry detected; stale :xemu process reuse"); + return 1; + } if (!qemu_main) { LogError("xemu core not linked; qemu_main missing"); + g_qemu_init_started.store(false); return 1; } LogInfo("xemu_android_main: qemu_init"); diff --git a/android/app/src/main/cpp/xemu_settings_android.cc b/android/app/src/main/cpp/xemu_settings_android.cc index 4c1c05d730..74fc8bf82d 100644 --- a/android/app/src/main/cpp/xemu_settings_android.cc +++ b/android/app/src/main/cpp/xemu_settings_android.cc @@ -17,6 +17,7 @@ struct config g_config; +static std::string settings_path_storage; static const char *settings_path; static const char *filename = "xemu.toml"; static std::string error_msg; @@ -158,10 +159,13 @@ const char *xemu_settings_get_error_message(void) void xemu_settings_set_path(const char *path) { - if (settings_path) { - return; + if (path && *path) { + settings_path_storage = path; + settings_path = settings_path_storage.c_str(); + } else { + settings_path_storage.clear(); + settings_path = NULL; } - settings_path = path; } const char *xemu_settings_get_base_path(void) @@ -187,7 +191,8 @@ const char *xemu_settings_get_path(void) } const char *base = xemu_settings_get_base_path(); - settings_path = g_strdup_printf("%s%s", base, filename); + settings_path_storage = std::string(base ? base : "") + filename; + settings_path = settings_path_storage.c_str(); return settings_path; } diff --git a/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt b/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt index e26cf7ee40..d825656c0c 100644 --- a/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt +++ b/android/app/src/main/java/com/izzy2lost/x1box/MainActivity.kt @@ -7,6 +7,7 @@ import android.hardware.input.InputManager import android.net.Uri import android.os.Build import android.os.Bundle +import android.os.Process import android.util.Log import android.view.InputDevice import android.view.KeyEvent @@ -56,6 +57,7 @@ class MainActivity : SDLActivity(), InputManager.InputDeviceListener { private var comboTriggered = false private var startupSnapshotSlot: Int? = null private var startupSnapshotLoadScheduled = false + @Volatile private var processTerminationScheduled = false override fun createSDLSurface(context: Context): SDLSurface { return super.createSDLSurface(context).apply { @@ -292,6 +294,11 @@ class MainActivity : SDLActivity(), InputManager.InputDeviceListener { Log.i(TAG, "onDestroy()") inGameMenuDialog?.dismiss() inGameMenuDialog = null + val shouldTerminateProcess = isFinishing && !isChangingConfigurations + + if (shouldTerminateProcess) { + terminateXemuProcessSoon("activity finish") + } // Unregister virtual controller try { @@ -680,7 +687,7 @@ class MainActivity : SDLActivity(), InputManager.InputDeviceListener { 2 -> showSaveStateDialog() 3 -> showLoadStateDialog() 4 -> exitToGameLibrary() - 5 -> finishAffinity() + 5 -> quitApp() } } .setOnDismissListener { @@ -698,9 +705,32 @@ class MainActivity : SDLActivity(), InputManager.InputDeviceListener { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP) } startActivity(intent) + terminateXemuProcessSoon("exit to library") finish() } + private fun quitApp() { + terminateXemuProcessSoon("quit app") + finishAffinity() + } + + private fun terminateXemuProcessSoon(reason: String) { + if (processTerminationScheduled) { + return + } + processTerminationScheduled = true + + Thread { + try { + Thread.sleep(350) + } catch (_: InterruptedException) { + Thread.currentThread().interrupt() + } + Log.i(TAG, "Terminating :xemu process after $reason") + Process.killProcess(Process.myPid()) + }.start() + } + override fun getLibraries(): Array = arrayOf( "SDL2", "xemu",