|
Packit |
a6d1f1 |
#ifdef _WIN32
|
|
Packit |
a6d1f1 |
#include <windows.h>
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
#if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
|
|
Packit |
a6d1f1 |
#define U64(x) x##Ui64
|
|
Packit |
a6d1f1 |
#else
|
|
Packit |
a6d1f1 |
#define U64(x) x##ULL
|
|
Packit |
a6d1f1 |
#endif
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
#define DELTA_EPOCH_IN_100NS U64(116444736000000000)
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
static long ticks_to_nanos(LONGLONG subsecond_time, LONGLONG frequency)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
return (long)((1e9 * subsecond_time) / frequency);
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
static ULONGLONG to_quad_100ns(FILETIME ft)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
ULARGE_INTEGER li;
|
|
Packit |
a6d1f1 |
li.LowPart = ft.dwLowDateTime;
|
|
Packit |
a6d1f1 |
li.HighPart = ft.dwHighDateTime;
|
|
Packit |
a6d1f1 |
return li.QuadPart;
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
static void to_timespec_from_100ns(ULONGLONG t_100ns, long long *t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
t[0] = (long)(t_100ns / 10000000UL);
|
|
Packit |
a6d1f1 |
t[1] = 100*(long)(t_100ns % 10000000UL);
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_gettime_monotonic(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
LARGE_INTEGER time;
|
|
Packit |
a6d1f1 |
LARGE_INTEGER frequency;
|
|
Packit |
a6d1f1 |
QueryPerformanceCounter(&time);
|
|
Packit |
a6d1f1 |
QueryPerformanceFrequency(&frequency);
|
|
Packit |
a6d1f1 |
// seconds
|
|
Packit |
a6d1f1 |
t[0] = time.QuadPart / frequency.QuadPart;
|
|
Packit |
a6d1f1 |
// nanos =
|
|
Packit |
a6d1f1 |
t[1] = ticks_to_nanos(time.QuadPart % frequency.QuadPart, frequency.QuadPart);
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_gettime_realtime(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
FILETIME ft;
|
|
Packit |
a6d1f1 |
ULONGLONG tmp;
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
GetSystemTimeAsFileTime(&ft;;
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
tmp = to_quad_100ns(ft);
|
|
Packit |
a6d1f1 |
tmp -= DELTA_EPOCH_IN_100NS;
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
to_timespec_from_100ns(tmp, t);
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_gettime_processtime(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
FILETIME creation_time, exit_time, kernel_time, user_time;
|
|
Packit |
a6d1f1 |
ULONGLONG time;
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
GetProcessTimes(GetCurrentProcess(), &creation_time, &exit_time, &kernel_time, &user_time);
|
|
Packit |
a6d1f1 |
// Both kernel and user, acc. to http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_117
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
time = to_quad_100ns(user_time) + to_quad_100ns(kernel_time);
|
|
Packit |
a6d1f1 |
to_timespec_from_100ns(time, t);
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_gettime_threadtime(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
FILETIME creation_time, exit_time, kernel_time, user_time;
|
|
Packit |
a6d1f1 |
ULONGLONG time;
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
GetThreadTimes(GetCurrentThread(), &creation_time, &exit_time, &kernel_time, &user_time);
|
|
Packit |
a6d1f1 |
// Both kernel and user, acc. to http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap03.html#tag_03_117
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
time = to_quad_100ns(user_time) + to_quad_100ns(kernel_time);
|
|
Packit |
a6d1f1 |
to_timespec_from_100ns(time, t);
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_getres_monotonic(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
LARGE_INTEGER frequency;
|
|
Packit |
a6d1f1 |
QueryPerformanceFrequency(&frequency);
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
ULONGLONG resolution = U64(1000000000)/frequency.QuadPart;
|
|
Packit |
a6d1f1 |
t[0] = resolution / U64(1000000000);
|
|
Packit |
a6d1f1 |
t[1] = resolution % U64(1000000000);
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_getres_realtime(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
t[0] = 0;
|
|
Packit |
a6d1f1 |
t[1] = 100;
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_getres_processtime(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
t[0] = 0;
|
|
Packit |
a6d1f1 |
t[1] = 100;
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
void hs_clock_win32_getres_threadtime(long long* t)
|
|
Packit |
a6d1f1 |
{
|
|
Packit |
a6d1f1 |
t[0] = 0;
|
|
Packit |
a6d1f1 |
t[1] = 100;
|
|
Packit |
a6d1f1 |
}
|
|
Packit |
a6d1f1 |
|
|
Packit |
a6d1f1 |
#endif /* _WIN32 */
|