mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-05-27 21:42:40 +00:00
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:
parent
8ee64a84c7
commit
bad78cfed4
8 changed files with 25 additions and 20 deletions
|
@ -23,17 +23,9 @@ PerformanceTracker::PerformanceTracker(const std::optional<std::string> log_name
|
|||
const std::optional<DT> sample_window_duration)
|
||||
: m_log_name{log_name}, m_sample_window_duration{sample_window_duration}
|
||||
{
|
||||
m_on_state_changed_handle =
|
||||
Core::AddOnStateChangedCallback([this](Core::State state) { m_is_last_time_sane = false; });
|
||||
|
||||
Reset();
|
||||
}
|
||||
|
||||
PerformanceTracker::~PerformanceTracker()
|
||||
{
|
||||
Core::RemoveOnStateChangedCallback(&m_on_state_changed_handle);
|
||||
}
|
||||
|
||||
void PerformanceTracker::Reset()
|
||||
{
|
||||
m_raw_dts.Clear();
|
||||
|
@ -135,6 +127,11 @@ DT PerformanceTracker::GetLastRawDt() const
|
|||
return m_last_raw_dt;
|
||||
}
|
||||
|
||||
void PerformanceTracker::InvalidateLastTime()
|
||||
{
|
||||
m_is_last_time_sane = false;
|
||||
}
|
||||
|
||||
void PerformanceTracker::ImPlotPlotLines(const char* label) const
|
||||
{
|
||||
// "quality" graph uses twice as many points.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue