aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordexX7 <dexx@bitwatch.co>2015-03-11 13:34:20 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2015-03-24 08:45:24 +0100
commitc9e022b7eee9f77cd33b333d6ff52f711d3bc989 (patch)
tree13a3b0e12b29ca1c08b81a8997015113ff142489
parent10c09f98b2c29516aa5f71d7f9dc0e24145baccc (diff)
Initialization: set Boost path locale in main thread
The path locale is lazy initialized and to avoid deinitialization errors in multithreading environments, it is set explicitly by the main thread. Conflicts: src/util.cpp Rebased-From: 317e66c741aef0fd272e50aa2e82ff192ca5f7e5 Github-Pull: #5877
-rw-r--r--src/util.cpp21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/util.cpp b/src/util.cpp
index 0cdf4e614d..a03f55c910 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -713,19 +713,18 @@ void RenameThread(const char* name)
void SetupEnvironment()
{
-#ifndef WIN32
- try
- {
-#if BOOST_FILESYSTEM_VERSION == 3
- boost::filesystem::path::codecvt(); // Raises runtime error if current locale is invalid
-#else // boost filesystem v2
- std::locale(); // Raises runtime error if current locale is invalid
-#endif
- } catch(std::runtime_error &e)
- {
- setenv("LC_ALL", "C", 1); // Force C locale
+ // On most POSIX systems (e.g. Linux, but not BSD) the environment's locale
+ // may be invalid, in which case the "C" locale is used as fallback.
+#if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
+ try {
+ std::locale(""); // Raises a runtime error if current locale is invalid
+ } catch (const std::runtime_error&) {
+ std::locale::global(std::locale("C"));
}
#endif
+ // The path locale is lazy initialized and to avoid deinitialization errors
+ // in multithreading environments, it is set explicitly by the main thread.
+ boost::filesystem::path::imbue(std::locale());
}
void SetThreadPriority(int nPriority)