Fix static initialisation order fiasco issue for Version variables
Fixes a crash that could occur if the static constructor function for the MainSettings.cpp TU happened to run before the variables in Common/Version.cpp are initialised. (This is known as the static initialisation order fiasco.) By using wrapper functions, those variables are now guaranteed to be constructed on first use.
This commit is contained in:
parent
07fd17445c
commit
83c5446d85
|
@ -299,13 +299,13 @@ JNIEXPORT double JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetInputRa
|
|||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetVersionString(JNIEnv* env,
|
||||
jclass)
|
||||
{
|
||||
return ToJString(env, Common::scm_rev_str);
|
||||
return ToJString(env, Common::GetScmRevStr());
|
||||
}
|
||||
|
||||
JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetGitRevision(JNIEnv* env,
|
||||
jclass)
|
||||
{
|
||||
return ToJString(env, Common::scm_rev_git_str);
|
||||
return ToJString(env, Common::GetScmRevGitStr());
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveScreenShot(JNIEnv*, jclass)
|
||||
|
|
|
@ -149,8 +149,8 @@ private:
|
|||
{
|
||||
// Null-terminator is intentionally not copied.
|
||||
std::memcpy(&id, "DCAC", sizeof(u32));
|
||||
std::memcpy(ver, Common::scm_rev_git_str.c_str(),
|
||||
std::min(Common::scm_rev_git_str.size(), sizeof(ver)));
|
||||
std::memcpy(ver, Common::GetScmRevGitStr().c_str(),
|
||||
std::min(Common::GetScmRevGitStr().size(), sizeof(ver)));
|
||||
}
|
||||
|
||||
u32 id = 0;
|
||||
|
|
|
@ -17,28 +17,61 @@ namespace Common
|
|||
#define BUILD_TYPE_STR ""
|
||||
#endif
|
||||
|
||||
const std::string scm_rev_str = "Dolphin "
|
||||
const std::string& GetScmRevStr()
|
||||
{
|
||||
static const std::string scm_rev_str = "Dolphin "
|
||||
#if !SCM_IS_MASTER
|
||||
"[" SCM_BRANCH_STR "] "
|
||||
"[" SCM_BRANCH_STR "] "
|
||||
#endif
|
||||
|
||||
#ifdef __INTEL_COMPILER
|
||||
BUILD_TYPE_STR SCM_DESC_STR "-ICC";
|
||||
BUILD_TYPE_STR SCM_DESC_STR "-ICC";
|
||||
#else
|
||||
BUILD_TYPE_STR SCM_DESC_STR;
|
||||
BUILD_TYPE_STR SCM_DESC_STR;
|
||||
#endif
|
||||
return scm_rev_str;
|
||||
}
|
||||
|
||||
const std::string scm_rev_git_str = SCM_REV_STR;
|
||||
const std::string scm_desc_str = SCM_DESC_STR;
|
||||
const std::string scm_branch_str = SCM_BRANCH_STR;
|
||||
const std::string scm_distributor_str = SCM_DISTRIBUTOR_STR;
|
||||
const std::string scm_update_track_str = SCM_UPDATE_TRACK_STR;
|
||||
const std::string& GetScmRevGitStr()
|
||||
{
|
||||
static const std::string scm_rev_git_str = SCM_REV_STR;
|
||||
return scm_rev_git_str;
|
||||
}
|
||||
|
||||
const std::string& GetScmDescStr()
|
||||
{
|
||||
static const std::string scm_desc_str = SCM_DESC_STR;
|
||||
return scm_desc_str;
|
||||
}
|
||||
|
||||
const std::string& GetScmBranchStr()
|
||||
{
|
||||
static const std::string scm_branch_str = SCM_BRANCH_STR;
|
||||
return scm_branch_str;
|
||||
}
|
||||
|
||||
const std::string& GetScmDistributorStr()
|
||||
{
|
||||
static const std::string scm_distributor_str = SCM_DISTRIBUTOR_STR;
|
||||
return scm_distributor_str;
|
||||
}
|
||||
|
||||
const std::string& GetScmUpdateTrackStr()
|
||||
{
|
||||
static const std::string scm_update_track_str = SCM_UPDATE_TRACK_STR;
|
||||
return scm_update_track_str;
|
||||
}
|
||||
|
||||
const std::string& GetNetplayDolphinVer()
|
||||
{
|
||||
#ifdef _WIN32
|
||||
const std::string netplay_dolphin_ver = SCM_DESC_STR " Win";
|
||||
static const std::string netplay_dolphin_ver = SCM_DESC_STR " Win";
|
||||
#elif __APPLE__
|
||||
const std::string netplay_dolphin_ver = SCM_DESC_STR " Mac";
|
||||
static const std::string netplay_dolphin_ver = SCM_DESC_STR " Mac";
|
||||
#else
|
||||
const std::string netplay_dolphin_ver = SCM_DESC_STR " Lin";
|
||||
static const std::string netplay_dolphin_ver = SCM_DESC_STR " Lin";
|
||||
#endif
|
||||
return netplay_dolphin_ver;
|
||||
}
|
||||
|
||||
} // namespace Common
|
||||
|
|
|
@ -7,12 +7,11 @@
|
|||
|
||||
namespace Common
|
||||
{
|
||||
// Git version number
|
||||
extern const std::string scm_desc_str;
|
||||
extern const std::string scm_branch_str;
|
||||
extern const std::string scm_rev_str;
|
||||
extern const std::string scm_rev_git_str;
|
||||
extern const std::string scm_distributor_str;
|
||||
extern const std::string scm_update_track_str;
|
||||
extern const std::string netplay_dolphin_ver;
|
||||
const std::string& GetScmDescStr();
|
||||
const std::string& GetScmBranchStr();
|
||||
const std::string& GetScmRevStr();
|
||||
const std::string& GetScmRevGitStr();
|
||||
const std::string& GetScmDistributorStr();
|
||||
const std::string& GetScmUpdateTrackStr();
|
||||
const std::string& GetNetplayDolphinVer();
|
||||
} // namespace Common
|
||||
|
|
|
@ -381,7 +381,7 @@ const Info<bool> MAIN_FIFOPLAYER_EARLY_MEMORY_UPDATES{
|
|||
// Main.AutoUpdate
|
||||
|
||||
const Info<std::string> MAIN_AUTOUPDATE_UPDATE_TRACK{{System::Main, "AutoUpdate", "UpdateTrack"},
|
||||
Common::scm_update_track_str};
|
||||
Common::GetScmUpdateTrackStr()};
|
||||
const Info<std::string> MAIN_AUTOUPDATE_HASH_OVERRIDE{{System::Main, "AutoUpdate", "HashOverride"},
|
||||
""};
|
||||
|
||||
|
|
|
@ -982,7 +982,7 @@ void UpdateTitle(u32 ElapseTime)
|
|||
}
|
||||
}
|
||||
|
||||
std::string message = fmt::format("{} | {} | {}", Common::scm_rev_str, SSettings, SFPS);
|
||||
std::string message = fmt::format("{} | {} | {}", Common::GetScmRevStr(), SSettings, SFPS);
|
||||
if (Config::Get(Config::MAIN_SHOW_ACTIVE_TITLE))
|
||||
{
|
||||
const std::string& title = SConfig::GetInstance().GetTitleDescription();
|
||||
|
|
|
@ -248,10 +248,10 @@ void DolphinAnalytics::MakeBaseBuilder()
|
|||
Common::AnalyticsReportBuilder builder;
|
||||
|
||||
// Version information.
|
||||
builder.AddData("version-desc", Common::scm_desc_str);
|
||||
builder.AddData("version-hash", Common::scm_rev_git_str);
|
||||
builder.AddData("version-branch", Common::scm_branch_str);
|
||||
builder.AddData("version-dist", Common::scm_distributor_str);
|
||||
builder.AddData("version-desc", Common::GetScmDescStr());
|
||||
builder.AddData("version-hash", Common::GetScmRevGitStr());
|
||||
builder.AddData("version-branch", Common::GetScmBranchStr());
|
||||
builder.AddData("version-dist", Common::GetScmDistributorStr());
|
||||
|
||||
// Auto-Update information.
|
||||
builder.AddData("update-track", Config::Get(Config::MAIN_AUTOUPDATE_UPDATE_TRACK));
|
||||
|
|
|
@ -58,10 +58,10 @@ IPCReply GetVersion(const IOCtlVRequest& request)
|
|||
return IPCReply(IPC_EINVAL);
|
||||
}
|
||||
|
||||
const auto length = std::min(size_t(request.io_vectors[0].size), Common::scm_desc_str.size());
|
||||
const auto length = std::min(size_t(request.io_vectors[0].size), Common::GetScmDescStr().size());
|
||||
|
||||
Memory::Memset(request.io_vectors[0].address, 0, request.io_vectors[0].size);
|
||||
Memory::CopyToEmu(request.io_vectors[0].address, Common::scm_desc_str.data(), length);
|
||||
Memory::CopyToEmu(request.io_vectors[0].address, Common::GetScmDescStr().data(), length);
|
||||
|
||||
return IPCReply(IPC_SUCCESS);
|
||||
}
|
||||
|
|
|
@ -1471,7 +1471,7 @@ void GetSettings()
|
|||
s_memcards |= (slot_a_has_raw_memcard || slot_a_has_gci_folder) << 0;
|
||||
s_memcards |= (slot_b_has_raw_memcard || slot_b_has_gci_folder) << 1;
|
||||
|
||||
s_revision = ConvertGitRevisionToBytes(Common::scm_rev_git_str);
|
||||
s_revision = ConvertGitRevisionToBytes(Common::GetScmRevGitStr());
|
||||
|
||||
if (!Config::Get(Config::MAIN_DSP_HLE))
|
||||
{
|
||||
|
|
|
@ -229,8 +229,8 @@ bool NetPlayClient::Connect()
|
|||
{
|
||||
// send connect message
|
||||
sf::Packet packet;
|
||||
packet << Common::scm_rev_git_str;
|
||||
packet << Common::netplay_dolphin_ver;
|
||||
packet << Common::GetScmRevGitStr();
|
||||
packet << Common::GetNetplayDolphinVer();
|
||||
packet << m_player_name;
|
||||
Send(packet);
|
||||
enet_host_flush(m_client);
|
||||
|
@ -283,7 +283,7 @@ bool NetPlayClient::Connect()
|
|||
Player player;
|
||||
player.name = m_player_name;
|
||||
player.pid = m_pid;
|
||||
player.revision = Common::netplay_dolphin_ver;
|
||||
player.revision = Common::GetNetplayDolphinVer();
|
||||
|
||||
// add self to player list
|
||||
m_players[m_pid] = player;
|
||||
|
|
|
@ -393,7 +393,7 @@ ConnectionError NetPlayServer::OnConnect(ENetPeer* socket, sf::Packet& rpac)
|
|||
std::string npver;
|
||||
rpac >> npver;
|
||||
// Dolphin netplay version
|
||||
if (npver != Common::scm_rev_git_str)
|
||||
if (npver != Common::GetScmRevGitStr())
|
||||
return ConnectionError::VersionMismatch;
|
||||
|
||||
// game is currently running or game start is pending
|
||||
|
|
|
@ -116,7 +116,7 @@ static bool DoStateVersion(PointerWrap& p, std::string* version_created_by)
|
|||
version = cookie - COOKIE_BASE;
|
||||
}
|
||||
|
||||
*version_created_by = Common::scm_rev_str;
|
||||
*version_created_by = Common::GetScmRevStr();
|
||||
if (version > 42)
|
||||
p.Do(*version_created_by);
|
||||
else
|
||||
|
|
|
@ -125,7 +125,7 @@ RedumpVerifier::DownloadStatus RedumpVerifier::DownloadDatfile(const std::string
|
|||
|
||||
const std::optional<std::vector<u8>> result =
|
||||
request.Get("http://redump.org/datfile/" + system + "/serial,version",
|
||||
{{"User-Agent", Common::scm_rev_str}});
|
||||
{{"User-Agent", Common::GetScmRevStr()}});
|
||||
|
||||
const std::string output_path = GetPathForSystem(system);
|
||||
|
||||
|
|
|
@ -47,12 +47,12 @@ AboutDialog::AboutDialog(QWidget* parent) : QDialog(parent)
|
|||
<a href='https://forums.dolphin-emu.org/'>%SUPPORT%</a>
|
||||
)")
|
||||
.replace(QStringLiteral("%VERSION_STRING%"),
|
||||
QString::fromUtf8(Common::scm_desc_str.c_str()))
|
||||
QString::fromUtf8(Common::GetScmDescStr().c_str()))
|
||||
.replace(QStringLiteral("%BRANCH%"),
|
||||
// i18n: "Branch" means the version control term, not a literal tree branch.
|
||||
tr("Branch: %1").arg(QString::fromUtf8(Common::scm_branch_str.c_str())))
|
||||
tr("Branch: %1").arg(QString::fromUtf8(Common::GetScmBranchStr().c_str())))
|
||||
.replace(QStringLiteral("%REVISION%"),
|
||||
tr("Revision: %1").arg(QString::fromUtf8(Common::scm_rev_git_str.c_str())))
|
||||
tr("Revision: %1").arg(QString::fromUtf8(Common::GetScmRevGitStr().c_str())))
|
||||
.replace(QStringLiteral("%QT_VERSION%"),
|
||||
tr("Using Qt %1").arg(QStringLiteral(QT_VERSION_STR)))
|
||||
.replace(QStringLiteral("%CHECK_FOR_UPDATES%"), tr("Check for updates"))
|
||||
|
|
|
@ -206,7 +206,7 @@ MainWindow::MainWindow(std::unique_ptr<BootParameters> boot_parameters,
|
|||
const std::string& movie_path)
|
||||
: QMainWindow(nullptr)
|
||||
{
|
||||
setWindowTitle(QString::fromStdString(Common::scm_rev_str));
|
||||
setWindowTitle(QString::fromStdString(Common::GetScmRevStr()));
|
||||
setWindowIcon(Resources::GetAppIcon());
|
||||
setUnifiedTitleAndToolBarOnMac(true);
|
||||
setAcceptDrops(true);
|
||||
|
@ -1145,7 +1145,7 @@ void MainWindow::HideRenderWidget(bool reinit, bool is_exit)
|
|||
m_rendering_to_main = false;
|
||||
m_stack->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||
disconnect(Host::GetInstance(), &Host::RequestTitle, this, &MainWindow::setWindowTitle);
|
||||
setWindowTitle(QString::fromStdString(Common::scm_rev_str));
|
||||
setWindowTitle(QString::fromStdString(Common::GetScmRevStr()));
|
||||
}
|
||||
|
||||
// The following code works around a driver bug that would lead to Dolphin crashing when changing
|
||||
|
|
|
@ -158,7 +158,7 @@ void NetPlayBrowser::Refresh()
|
|||
std::map<std::string, std::string> filters;
|
||||
|
||||
if (m_check_hide_incompatible->isChecked())
|
||||
filters["version"] = Common::scm_desc_str;
|
||||
filters["version"] = Common::GetScmDescStr();
|
||||
|
||||
if (!m_edit_name->text().isEmpty())
|
||||
filters["name"] = m_edit_name->text().toStdString();
|
||||
|
@ -246,7 +246,7 @@ void NetPlayBrowser::UpdateList()
|
|||
auto* player_count = new QTableWidgetItem(QStringLiteral("%1").arg(entry.player_count));
|
||||
auto* version = new QTableWidgetItem(QString::fromStdString(entry.version));
|
||||
|
||||
const bool enabled = Common::scm_desc_str == entry.version;
|
||||
const bool enabled = Common::GetScmDescStr() == entry.version;
|
||||
|
||||
for (const auto& item : {region, name, password, in_game, game_id, player_count, version})
|
||||
item->setFlags(enabled ? Qt::ItemIsEnabled | Qt::ItemIsSelectable : Qt::NoItemFlags);
|
||||
|
|
|
@ -55,7 +55,7 @@ void Updater::OnUpdateAvailable(const NewVersionInformation& info)
|
|||
"download. "
|
||||
"You are running %2.<br> Would you like to update?<br><h4>Release Notes:</h4>")
|
||||
.arg(QString::fromStdString(info.new_shortrev))
|
||||
.arg(QString::fromStdString(Common::scm_desc_str)));
|
||||
.arg(QString::fromStdString(Common::GetScmDescStr())));
|
||||
label->setTextFormat(Qt::RichText);
|
||||
|
||||
auto* changelog = new QTextBrowser;
|
||||
|
|
|
@ -161,7 +161,7 @@ void AutoUpdateChecker::CheckForUpdate(std::string_view update_track,
|
|||
CleanupFromPreviousUpdate();
|
||||
#endif
|
||||
|
||||
std::string_view version_hash = hash_override.empty() ? Common::scm_rev_git_str : hash_override;
|
||||
std::string_view version_hash = hash_override.empty() ? Common::GetScmRevGitStr() : hash_override;
|
||||
std::string url = fmt::format("https://dolphin-emu.org/update/check/v1/{}/{}/{}", update_track,
|
||||
version_hash, GetPlatformID());
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ private:
|
|||
std::unique_ptr<optparse::OptionParser> CreateParser(ParserOptions options)
|
||||
{
|
||||
auto parser = std::make_unique<optparse::OptionParser>();
|
||||
parser->usage("usage: %prog [options]... [FILE]...").version(Common::scm_rev_str);
|
||||
parser->usage("usage: %prog [options]... [FILE]...").version(Common::GetScmRevStr());
|
||||
|
||||
parser->add_option("-u", "--user").action("store").help("User folder path");
|
||||
parser->add_option("-m", "--movie").action("store").help("Play a movie file");
|
||||
|
|
|
@ -170,7 +170,7 @@ bool NetPlayIndex::Add(const NetPlaySession& session)
|
|||
"&password=" + std::to_string(session.has_password) + "&method=" + session.method +
|
||||
"&server_id=" + session.server_id + "&in_game=" + std::to_string(session.in_game) +
|
||||
"&port=" + std::to_string(session.port) + "&player_count=" +
|
||||
std::to_string(session.player_count) + "&version=" + Common::scm_desc_str,
|
||||
std::to_string(session.player_count) + "&version=" + Common::GetScmDescStr(),
|
||||
{{"X-Is-Dolphin", "1"}}, Common::HttpRequest::AllowedReturnCodes::All);
|
||||
|
||||
if (!response.has_value())
|
||||
|
|
|
@ -115,7 +115,7 @@ std::optional<Shader::BinaryData> Shader::CompileShader(D3D_FEATURE_LEVEL featur
|
|||
file << "\n";
|
||||
file.write(static_cast<const char*>(errors->GetBufferPointer()), errors->GetBufferSize());
|
||||
file << "\n";
|
||||
file << "Dolphin Version: " + Common::scm_rev_str + "\n";
|
||||
file << "Dolphin Version: " + Common::GetScmRevStr() + "\n";
|
||||
file << "Video Backend: " + g_video_backend->GetDisplayName();
|
||||
file.close();
|
||||
|
||||
|
|
|
@ -363,7 +363,7 @@ bool ProgramShaderCache::CheckShaderCompileResult(GLuint id, GLenum type, std::s
|
|||
File::OpenFStream(file, filename, std::ios_base::out);
|
||||
file << s_glsl_header << code << info_log;
|
||||
file << "\n";
|
||||
file << "Dolphin Version: " + Common::scm_rev_str + "\n";
|
||||
file << "Dolphin Version: " + Common::GetScmRevStr() + "\n";
|
||||
file << "Video Backend: " + g_video_backend->GetDisplayName();
|
||||
file.close();
|
||||
|
||||
|
@ -408,7 +408,7 @@ bool ProgramShaderCache::CheckProgramLinkResult(GLuint id, std::string_view vcod
|
|||
|
||||
file << info_log;
|
||||
file << "\n";
|
||||
file << "Dolphin Version: " + Common::scm_rev_str + "\n";
|
||||
file << "Dolphin Version: " + Common::GetScmRevStr() + "\n";
|
||||
file << "Video Backend: " + g_video_backend->GetDisplayName();
|
||||
file.close();
|
||||
|
||||
|
|
|
@ -169,7 +169,7 @@ static std::optional<SPIRVCodeVector> CompileShaderToSPV(EShLanguage stage,
|
|||
}
|
||||
|
||||
stream << "\n";
|
||||
stream << "Dolphin Version: " + Common::scm_rev_str + "\n";
|
||||
stream << "Dolphin Version: " + Common::GetScmRevStr() + "\n";
|
||||
stream << "Video Backend: " + g_video_backend->GetDisplayName();
|
||||
|
||||
PanicAlertFmt("{} (written to {})", msg, filename);
|
||||
|
|
Loading…
Reference in New Issue