2014-06-29 08:18:21 +00:00
|
|
|
#ifndef GETTIME_H
|
|
|
|
#define GETTIME_H
|
|
|
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
#ifdef WIN32
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
|
|
|
#define CLOCK_REALTIME 0
|
|
|
|
#define CLOCK_MONOTONIC 0
|
|
|
|
|
|
|
|
static inline LARGE_INTEGER getFILETIMEoffset()
|
|
|
|
{
|
|
|
|
SYSTEMTIME s;
|
|
|
|
FILETIME f;
|
|
|
|
LARGE_INTEGER t;
|
|
|
|
|
|
|
|
s.wYear = 1970;
|
|
|
|
s.wMonth = 1;
|
|
|
|
s.wDay = 1;
|
|
|
|
s.wHour = 0;
|
|
|
|
s.wMinute = 0;
|
|
|
|
s.wSecond = 0;
|
|
|
|
s.wMilliseconds = 0;
|
|
|
|
SystemTimeToFileTime(&s, &f);
|
|
|
|
t.QuadPart = f.dwHighDateTime;
|
|
|
|
t.QuadPart <<= 32;
|
|
|
|
t.QuadPart |= f.dwLowDateTime;
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline int clock_gettime(int X, struct timespec *ts)
|
|
|
|
{
|
|
|
|
LARGE_INTEGER t;
|
|
|
|
FILETIME f;
|
|
|
|
double microseconds;
|
|
|
|
static LARGE_INTEGER offset;
|
|
|
|
static double frequencyToMicroseconds;
|
|
|
|
static int initialized = 0;
|
|
|
|
static BOOL usePerformanceCounter = 0;
|
|
|
|
|
|
|
|
if (!initialized) {
|
|
|
|
LARGE_INTEGER performanceFrequency;
|
|
|
|
initialized = 1;
|
|
|
|
usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
|
|
|
|
if (usePerformanceCounter) {
|
|
|
|
QueryPerformanceCounter(&offset);
|
|
|
|
frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
|
|
|
|
} else {
|
|
|
|
offset = getFILETIMEoffset();
|
|
|
|
frequencyToMicroseconds = 10.;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (usePerformanceCounter) {
|
|
|
|
QueryPerformanceCounter(&t);
|
|
|
|
} else {
|
|
|
|
GetSystemTimeAsFileTime(&f);
|
|
|
|
t.QuadPart = f.dwHighDateTime;
|
|
|
|
t.QuadPart <<= 32;
|
|
|
|
t.QuadPart |= f.dwLowDateTime;
|
|
|
|
}
|
|
|
|
|
|
|
|
t.QuadPart -= offset.QuadPart;
|
|
|
|
microseconds = (double)t.QuadPart / frequencyToMicroseconds;
|
|
|
|
t.QuadPart = microseconds;
|
|
|
|
ts->tv_sec = t.QuadPart / 1000000;
|
|
|
|
ts->tv_nsec = (t.QuadPart % 1000000) * 1000;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static inline unsigned gettime(void)
|
|
|
|
{
|
|
|
|
struct timespec ts;
|
|
|
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
|
|
return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|