From a261b83def46351bb48c4ef30316872f008e9433 Mon Sep 17 00:00:00 2001 From: Adrian <78108584+AdrianCassar@users.noreply.github.com> Date: Thu, 14 May 2026 19:16:46 +0100 Subject: [PATCH] [APP] Flush log & save config on quick exit --- src/xenia/app/xenia_main.cc | 3 +++ src/xenia/base/logging.cc | 18 +++++++++++++++++- src/xenia/base/logging.h | 1 + src/xenia/gpu/graphics_system.cc | 3 +++ src/xenia/kernel/xam/xam_info.cc | 4 ++++ 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/xenia/app/xenia_main.cc b/src/xenia/app/xenia_main.cc index fd3e694ba..8092ebf0e 100644 --- a/src/xenia/app/xenia_main.cc +++ b/src/xenia/app/xenia_main.cc @@ -574,6 +574,9 @@ void EmulatorApp::OnDestroy() { // TODO(DrChat): Remove this code and do a proper exit. XELOGI("Cheap-skate exit!"); + + xe::FlushLog(); + std::quick_exit(EXIT_SUCCESS); } diff --git a/src/xenia/base/logging.cc b/src/xenia/base/logging.cc index 9154306e6..3a3367c27 100644 --- a/src/xenia/base/logging.cc +++ b/src/xenia/base/logging.cc @@ -65,6 +65,7 @@ DEFINE_int32( namespace dp = disruptorplus; using namespace xe::literals; +using namespace std::chrono_literals; namespace xe { @@ -240,9 +241,15 @@ class Logger { sinks_.push_back(std::move(sink)); } + void FlushAllSinks() { + for (const auto& sink : sinks_) { + sink->Flush(); + } + } + private: static constexpr size_t kBufferSize = 8_MiB; - uint8_t buffer_[kBufferSize]; + uint8_t buffer_[kBufferSize] = {}; static constexpr size_t kBlockSize = 256; static constexpr size_t kBlockCount = kBufferSize / kBlockSize; @@ -468,6 +475,15 @@ void ShutdownLogging() { memory::AlignedFree(logger); } +void FlushLog() { + if (!logger_) { + return; + } + + xe::threading::Sleep(10ms); + logger_->FlushAllSinks(); +} + static int g_saved_loglevel = static_cast(LogLevel::Disabled); void logging::ToggleLogLevel() { auto swap = g_saved_loglevel; diff --git a/src/xenia/base/logging.h b/src/xenia/base/logging.h index d0e62cdf4..0541413f2 100644 --- a/src/xenia/base/logging.h +++ b/src/xenia/base/logging.h @@ -75,6 +75,7 @@ class DebugPrintLogSink final : public LogSink { // Must be called on startup. void InitializeLogging(const std::string_view app_name); void ShutdownLogging(); +void FlushLog(); namespace logging { diff --git a/src/xenia/gpu/graphics_system.cc b/src/xenia/gpu/graphics_system.cc index 27fa2a4a6..f43672a8e 100644 --- a/src/xenia/gpu/graphics_system.cc +++ b/src/xenia/gpu/graphics_system.cc @@ -286,6 +286,9 @@ void GraphicsSystem::OnHostGpuLossFromAnyThread( if (host_gpu_loss_reported_.test_and_set(std::memory_order_relaxed)) { return; } + + config::SaveConfig(); + xe::FatalError("Graphics device lost (probably due to an internal error)"); } diff --git a/src/xenia/kernel/xam/xam_info.cc b/src/xenia/kernel/xam/xam_info.cc index aaff814de..49776e249 100644 --- a/src/xenia/kernel/xam/xam_info.cc +++ b/src/xenia/kernel/xam/xam_info.cc @@ -11,6 +11,7 @@ #include "xenia/base/cvar.h" #include "xenia/base/logging.h" #include "xenia/base/string_util.h" +#include "xenia/config.h" #include "xenia/kernel/kernel_state.h" #include "xenia/kernel/title_id_utils.h" #include "xenia/kernel/user_module.h" @@ -324,6 +325,9 @@ void XamLoaderLaunchTitle_entry(lpstring_t raw_name_ptr, dword_t flags) { std::this_thread::yield(); } + config::SaveConfig(); + xe::FlushLog(); + std::quick_exit(0); }).detach(); });