Commit 927743a1 authored by Davis King's avatar Davis King

Made the global mutex construction for the get_current_dir() and set_current_dir()

routines more robust.
parent d9cd30a6
...@@ -33,7 +33,22 @@ namespace dlib ...@@ -33,7 +33,22 @@ namespace dlib
namespace namespace
{ {
mutex cwd_mutex; mutex& cwd_mutex()
{
static mutex m;
return m;
}
// Make sure the above mutex gets constructed before main()
// starts. This way we can be pretty sure it will be constructed
// before any threads could possibly call set_current_dir() or
// get_current_dir() simultaneously.
struct construct_cwd_mutex
{
construct_cwd_mutex()
{
cwd_mutex();
}
} oaimvweoinvwe;
} }
std::string get_current_dir ( std::string get_current_dir (
...@@ -41,7 +56,7 @@ namespace dlib ...@@ -41,7 +56,7 @@ namespace dlib
{ {
// need to lock a mutex here because getting and setting the // need to lock a mutex here because getting and setting the
// current working directory is not thread safe on windows. // current working directory is not thread safe on windows.
auto_mutex lock(cwd_mutex); auto_mutex lock(cwd_mutex());
char buf[1024]; char buf[1024];
if (GetCurrentDirectoryA(sizeof(buf),buf) == 0) if (GetCurrentDirectoryA(sizeof(buf),buf) == 0)
{ {
...@@ -61,7 +76,7 @@ namespace dlib ...@@ -61,7 +76,7 @@ namespace dlib
{ {
// need to lock a mutex here because getting and setting the // need to lock a mutex here because getting and setting the
// current working directory is not thread safe on windows. // current working directory is not thread safe on windows.
auto_mutex lock(cwd_mutex); auto_mutex lock(cwd_mutex());
if (SetCurrentDirectory(new_dir.c_str()) == 0) if (SetCurrentDirectory(new_dir.c_str()) == 0)
{ {
throw set_current_dir_error("Error changing current dir to '" + new_dir + "'"); throw set_current_dir_error("Error changing current dir to '" + new_dir + "'");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment