diff options
Diffstat (limited to 'ml/dlib/dlib/misc_api/misc_api_kernel_1.cpp')
-rw-r--r-- | ml/dlib/dlib/misc_api/misc_api_kernel_1.cpp | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/ml/dlib/dlib/misc_api/misc_api_kernel_1.cpp b/ml/dlib/dlib/misc_api/misc_api_kernel_1.cpp new file mode 100644 index 000000000..f17d850e1 --- /dev/null +++ b/ml/dlib/dlib/misc_api/misc_api_kernel_1.cpp @@ -0,0 +1,149 @@ +// Copyright (C) 2004 Davis E. King (davis@dlib.net) +// License: Boost Software License See LICENSE.txt for the full license. +#ifndef DLIB_MISC_API_KERNEL_1_CPp_ +#define DLIB_MISC_API_KERNEL_1_CPp_ + +#include "../platform.h" +#include "../threads.h" + +#ifdef WIN32 + +#include "misc_api_kernel_1.h" + +#include "../windows_magic.h" +#include <mmsystem.h> +#include <windows.h> + +// tell visual studio to link to the library needed to call timeGetTime() +#ifdef _MSC_VER +#pragma comment (lib, "winmm.lib") +#endif + +#ifdef __BORLANDC__ +// Apparently the borland compiler doesn't define this. +#define INVALID_FILE_ATTRIBUTES ((DWORD)-1) +#endif + +namespace dlib +{ +// ---------------------------------------------------------------------------------------- + + void sleep ( + unsigned long milliseconds + ) + { + ::Sleep(milliseconds); + } + +// ---------------------------------------------------------------------------------------- + + namespace + { + 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 ( + ) + { + // need to lock a mutex here because getting and setting the + // current working directory is not thread safe on windows. + auto_mutex lock(cwd_mutex()); + char buf[1024]; + if (GetCurrentDirectoryA(sizeof(buf),buf) == 0) + { + return std::string(); + } + else + { + return std::string(buf); + } + } + +// ---------------------------------------------------------------------------------------- + + void set_current_dir ( + const std::string& new_dir + ) + { + // need to lock a mutex here because getting and setting the + // current working directory is not thread safe on windows. + auto_mutex lock(cwd_mutex()); + if (SetCurrentDirectoryA(new_dir.c_str()) == 0) + { + throw set_current_dir_error("Error changing current dir to '" + new_dir + "'"); + } + } + +// ---------------------------------------------------------------------------------------- + + uint64 timestamper:: + get_timestamp ( + ) const + { + unsigned long temp = timeGetTime(); + if (temp >= last_time) + { + last_time = temp; + return (offset + temp)*1000; + } + else + { + last_time = temp; + + // there was overflow since the last call so we need to make the offset + // bigger to account for that + offset += dword_max; + return (offset + temp)*1000; + } + } + +// ---------------------------------------------------------------------------------------- + + void create_directory ( + const std::string& dir + ) + { + if (CreateDirectoryA(dir.c_str(),0) == 0) + { + // an error has occurred + if (GetLastError() == ERROR_ALREADY_EXISTS) + { + // make sure this is actually a directory + DWORD attribs = GetFileAttributesA(dir.c_str()); + if (attribs == INVALID_FILE_ATTRIBUTES || + (attribs&FILE_ATTRIBUTE_DIRECTORY) == 0) + { + // it isn't a directory + throw dir_create_error(dir); + } + } + else + { + throw dir_create_error(dir); + } + } + } + +// ---------------------------------------------------------------------------------------- + +} + +#endif // WIN32 + +#endif // DLIB_MISC_API_KERNEL_1_CPp_ + |