150 lines
3.9 KiB
C++
150 lines
3.9 KiB
C++
// 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_
|
|
|