aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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)