Core, VideoCommon: Fix crash at shutdown due to destructor ordering

Previously, PerformanceTracker registered a callback to be updated on
emulation state changes. PerformanceTrackers live in a global variable
(g_perf_metrics) within libvideocommon. The callback was stored in a
global variable in libcore. This created a race condition at shutdown
between these libraries, when the PerfTracker's destructor tried to
unregister the callback.
Notify the PerfTracker directly from libcore, without callbacks, since
Core.cpp already references g_perf_metrics explicitly. Also rename
Core::CallOnStateChangedCallbacks to NotifyStateChanged to better
reflect what it's doing.
This commit is contained in:
Mihai Brodschi
2025-04-27 17:33:23 +03:00
parent 8ee64a84c7
commit bad78cfed4
8 changed files with 25 additions and 20 deletions

View File

@ -16,7 +16,7 @@ class PerformanceTracker
public:
PerformanceTracker(const std::optional<std::string> log_name = std::nullopt,
const std::optional<DT> sample_window_duration = std::nullopt);
~PerformanceTracker();
~PerformanceTracker() = default;
PerformanceTracker(const PerformanceTracker&) = delete;
PerformanceTracker& operator=(const PerformanceTracker&) = delete;
@ -39,6 +39,7 @@ public:
DT GetDtAvg() const;
DT GetDtStd() const;
DT GetLastRawDt() const;
void InvalidateLastTime();
private:
void LogRenderTimeToFile(DT val);
@ -47,8 +48,6 @@ private:
void PushFront(DT value);
void PopBack();
int m_on_state_changed_handle;
// Name of log file and file stream
std::optional<std::string> m_log_name;
std::ofstream m_bench_file;