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:
Léo Lam
2022-01-14 00:04:22 +01:00
parent 07fd17445c
commit 83c5446d85
23 changed files with 86 additions and 54 deletions

View File

@ -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