summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/misc_api/misc_api_kernel_1.cpp
diff options
context:
space:
mode:
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.cpp149
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_
+