Make DolphinAnalytics a true singleton - static local variables are initialized in a thread safe manner since C++11

Also works around a Visual Studio 2017 bug where static inline class fields are destructed multiple times
This commit is contained in:
Silent 2019-06-23 19:26:07 +02:00
parent 5262f39026
commit 6c21811090
No known key found for this signature in database
GPG Key ID: AE53149BB0C45AF1
11 changed files with 16 additions and 25 deletions

View File

@ -639,7 +639,7 @@ static void Run(JNIEnv* env, const std::vector<std::string>& paths, bool first_o
if (first_open)
{
DolphinAnalytics::Instance()->ReportDolphinStart(GetAnalyticValue("DEVICE_TYPE"));
DolphinAnalytics::Instance().ReportDolphinStart(GetAnalyticValue("DEVICE_TYPE"));
}
WiimoteReal::InitAdapterClass();

View File

@ -53,14 +53,10 @@ DolphinAnalytics::DolphinAnalytics()
MakeBaseBuilder();
}
std::shared_ptr<DolphinAnalytics> DolphinAnalytics::Instance()
DolphinAnalytics& DolphinAnalytics::Instance()
{
std::lock_guard lk{s_instance_mutex};
if (!s_instance)
{
s_instance.reset(new DolphinAnalytics());
}
return s_instance;
static DolphinAnalytics instance;
return instance;
}
void DolphinAnalytics::ReloadConfig()

View File

@ -36,7 +36,7 @@ class DolphinAnalytics
{
public:
// Performs lazy-initialization of a singleton and returns the instance.
static std::shared_ptr<DolphinAnalytics> Instance();
static DolphinAnalytics& Instance();
#if defined(ANDROID)
// Get value from java.
@ -124,9 +124,4 @@ private:
std::mutex m_reporter_mutex;
Common::AnalyticsReporter m_reporter;
// Shared pointer in order to allow for multithreaded use of the instance and
// avoid races at reinitialization time.
static inline std::mutex s_instance_mutex;
static inline std::shared_ptr<DolphinAnalytics> s_instance;
};

View File

@ -745,7 +745,7 @@ void SConfig::SetRunningGameMetadata(const std::string& game_id, const std::stri
HLE::Reload();
PatchEngine::Reload();
HiresTexture::Update();
DolphinAnalytics::Instance()->ReportGameStart();
DolphinAnalytics::Instance().ReportGameStart();
}
}

View File

@ -322,7 +322,7 @@ static void CpuThread(const std::optional<std::string>& savestate_path, bool del
Common::SetCurrentThreadName("CPU-GPU thread");
// This needs to be delayed until after the video backend is ready.
DolphinAnalytics::Instance()->ReportGameStart();
DolphinAnalytics::Instance().ReportGameStart();
if (_CoreParameter.bFastmem)
EMM::InstallExceptionHandler(); // Let's run under memory watch

View File

@ -520,7 +520,7 @@ bool Wiimote::ProcessReadDataRequest()
m_read_request.address + m_read_request.size > CameraLogic::REPORT_DATA_OFFSET;
if (is_reading_ext || is_reading_ir)
DolphinAnalytics::Instance()->ReportGameQuirk(GameQuirk::DIRECTLY_READS_WIIMOTE_INPUT);
DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::DIRECTLY_READS_WIIMOTE_INPUT);
// Top byte of address is ignored on the bus, but it IS maintained in the read-reply.
auto const bytes_read = m_i2c_bus.BusRead(

View File

@ -154,7 +154,7 @@ u32 InstructionCache::ReadInstruction(u32 addr)
{
INFO_LOG(POWERPC, "ICache read at %08x returned stale data: CACHED: %08x vs. RAM: %08x", addr,
res, inmem);
DolphinAnalytics::Instance()->ReportGameQuirk(GameQuirk::ICACHE_MATTERS);
DolphinAnalytics::Instance().ReportGameQuirk(GameQuirk::ICACHE_MATTERS);
}
return res;
}

View File

@ -202,7 +202,7 @@ int main(int argc, char* argv[])
sigaction(SIGINT, &sa, nullptr);
sigaction(SIGTERM, &sa, nullptr);
DolphinAnalytics::Instance()->ReportDolphinStart("nogui");
DolphinAnalytics::Instance().ReportDolphinStart("nogui");
if (!BootManager::BootCore(std::move(boot), s_platform->GetWindowSystemInfo()))
{

View File

@ -177,7 +177,7 @@ int main(int argc, char* argv[])
int retval;
{
DolphinAnalytics::Instance()->ReportDolphinStart("qt");
DolphinAnalytics::Instance().ReportDolphinStart("qt");
MainWindow win{std::move(boot), static_cast<const char*>(options.get("movie"))};
if (options.is_set("debugger"))
@ -210,7 +210,7 @@ int main(int argc, char* argv[])
SConfig::GetInstance().m_analytics_permission_asked = true;
Settings::Instance().SetAnalyticsEnabled(answer == QMessageBox::Yes);
DolphinAnalytics::Instance()->ReloadConfig();
DolphinAnalytics::Instance().ReloadConfig();
}
#endif

View File

@ -300,7 +300,7 @@ void GeneralPane::OnSaveConfig()
#if defined(USE_ANALYTICS) && USE_ANALYTICS
Settings::Instance().SetAnalyticsEnabled(m_checkbox_enable_analytics->isChecked());
DolphinAnalytics::Instance()->ReloadConfig();
DolphinAnalytics::Instance().ReloadConfig();
#endif
settings.bCPUThread = m_checkbox_dualcore->isChecked();
Config::SetBaseOrCurrent(Config::MAIN_CPU_THREAD, m_checkbox_dualcore->isChecked());
@ -325,8 +325,8 @@ void GeneralPane::OnSaveConfig()
#if defined(USE_ANALYTICS) && USE_ANALYTICS
void GeneralPane::GenerateNewIdentity()
{
DolphinAnalytics::Instance()->GenerateNewIdentity();
DolphinAnalytics::Instance()->ReloadConfig();
DolphinAnalytics::Instance().GenerateNewIdentity();
DolphinAnalytics::Instance().ReloadConfig();
ModalMessageBox message_box(this);
message_box.setIcon(QMessageBox::Information);
message_box.setWindowTitle(tr("Identity Generation"));

View File

@ -1282,7 +1282,7 @@ void Renderer::Swap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u6
perf_sample.speed_ratio = SystemTimers::GetEstimatedEmulationPerformance();
perf_sample.num_prims = stats.thisFrame.numPrims + stats.thisFrame.numDLPrims;
perf_sample.num_draw_calls = stats.thisFrame.numDrawCalls;
DolphinAnalytics::Instance()->ReportPerformanceInfo(std::move(perf_sample));
DolphinAnalytics::Instance().ReportPerformanceInfo(std::move(perf_sample));
if (IsFrameDumping())
DumpCurrentFrame(xfb_entry->texture.get(), xfb_rect, ticks);