Skip to content
Permalink
Browse files

Make DolphinAnalytics a true singleton - static local variables are i…

…nitialized 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
  • Loading branch information...
CookiePLMonster committed Jun 23, 2019
1 parent 5262f39 commit 6c218110909003efdb1897a6b398cba37f16a58a
@@ -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();
@@ -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()
@@ -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 @@ class DolphinAnalytics

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;
};
@@ -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();
}
}

@@ -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
@@ -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(
@@ -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;
}
@@ -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()))
{
@@ -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

@@ -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"));
@@ -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);

0 comments on commit 6c21811

Please sign in to comment.
You can’t perform that action at this time.