94 lines
2.5 KiB
C++
94 lines
2.5 KiB
C++
// clock_gettime.cpp: Windows emulation of common time functions
|
|
// Libunistd Copyright Nov 10, 2002, Robin.Rowe@CinePaint.org
|
|
// License MIT (http://opensource.org/licenses/mit-license.php)
|
|
|
|
#undef _CRT_NO_TIME_T
|
|
#include <time.h>
|
|
#include <chrono>
|
|
#include <thread>
|
|
#include <string>
|
|
#include "unistd.h"
|
|
#include "../portable/stub.h"
|
|
#include "clock_gettime.h"
|
|
|
|
#pragma warning(disable:4996)
|
|
|
|
#if _MSC_VER <= 1800
|
|
struct timespec {
|
|
time_t tv_sec; /* seconds */
|
|
long tv_nsec; /* nanoseconds */
|
|
};
|
|
|
|
// std::chrono::high_resolution_clock
|
|
#endif
|
|
|
|
int sleep(useconds_t delay)
|
|
{ std::this_thread::sleep_for(std::chrono::seconds(delay));
|
|
return 0;
|
|
}
|
|
|
|
int usleep(useconds_t delay)
|
|
{ std::this_thread::sleep_for(std::chrono::nanoseconds(delay));
|
|
return 0;
|
|
}
|
|
|
|
int nanosleep(const struct timespec *req, struct timespec *rem)
|
|
{ (void)rem;
|
|
long long delay = req->tv_sec;
|
|
const long long billion = 1000000000LL;
|
|
delay*=billion;
|
|
delay+=req->tv_nsec;
|
|
return usleep(delay);
|
|
}
|
|
|
|
int clock_getres(clockid_t clk_id, struct timespec *res)
|
|
{ (void)clk_id;
|
|
(void)res;
|
|
STUB_NEG(clock_getres);
|
|
}
|
|
|
|
// seconds and nanosecond count of the time since the Epoch (00:00 1 January, 1970 UTC).
|
|
|
|
int clock_gettime(clockid_t clk_id, struct timespec *tp)
|
|
{
|
|
#if 0
|
|
LARGE_INTEGER frequency;
|
|
LARGE_INTEGER start;
|
|
LARGE_INTEGER end;
|
|
double elapsedSeconds;
|
|
QueryPerformanceFrequency(&frequency);
|
|
QueryPerformanceCounter(&start);
|
|
|
|
QueryPerformanceCounter(&end);
|
|
elapsedSeconds = (end.QuadPart - start.QuadPart) / (double)frequency.QuadPart;
|
|
#endif
|
|
if(CLOCK_REALTIME != clk_id && CLOCK_MONOTONIC != clk_id)
|
|
{ return -1;
|
|
}
|
|
SYSTEMTIME systemTime;
|
|
GetSystemTime(&systemTime);
|
|
FILETIME fileTime;
|
|
SystemTimeToFileTime(&systemTime,&fileTime);
|
|
ULARGE_INTEGER now = *(ULARGE_INTEGER*) &fileTime;
|
|
memset(&systemTime,0,sizeof(systemTime));
|
|
systemTime.wYear = 1970;
|
|
systemTime.wMonth = 1;
|
|
systemTime.wDay = 1;
|
|
SystemTimeToFileTime(&systemTime,&fileTime);
|
|
ULARGE_INTEGER in1970 = *(ULARGE_INTEGER*) &fileTime;
|
|
long long diff = now.QuadPart - in1970.QuadPart; //100-nanosecond intervals since January 1, 1970
|
|
diff *= 100;//nanoseconds
|
|
const long long nanosPerSecond = 1000*1000*1000;
|
|
tp->tv_sec = diff/nanosPerSecond; // 31557600 seconds/year, * 35 years = 1,420,092,000, says 1,464,129,754
|
|
tp->tv_nsec = diff%nanosPerSecond; // says 126,000,000, / 1,000,000,000 = .126
|
|
return 0;
|
|
}
|
|
|
|
int clock_settime(clockid_t clk_id, const struct timespec *tp)
|
|
{ (void)clk_id;
|
|
(void)tp;
|
|
STUB_NEG(clock_settime);
|
|
}
|
|
|
|
|