blob: 44742076ad97cf66e0054507c540990abb130e97 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
/**
* hdr_time.h
* Written by Michael Barker and Philip Orwig and released to the public domain,
* as explained at http://creativecommons.org/publicdomain/zero/1.0/
*/
#include "hdr_time.h"
#if defined(_WIN32) || defined(_WIN64)
#if !defined(WIN32_LEAN_AND_MEAN)
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
static int s_clockPeriodSet = 0;
static double s_clockPeriod = 1.0;
void hdr_gettime(hdr_timespec* t)
{
LARGE_INTEGER num;
/* if this is distasteful, we can add in an hdr_time_init() */
if (!s_clockPeriodSet)
{
QueryPerformanceFrequency(&num);
s_clockPeriod = 1.0 / (double) num.QuadPart;
s_clockPeriodSet = 1;
}
QueryPerformanceCounter(&num);
double seconds = num.QuadPart * s_clockPeriod;
double integral;
double remainder = modf(seconds, &integral);
t->tv_sec = (long) integral;
t->tv_nsec = (long) (remainder * 1000000000);
}
#elif defined(__APPLE__)
#include <mach/clock.h>
#include <mach/mach.h>
void hdr_gettime(hdr_timespec* ts)
{
clock_serv_t cclock;
mach_timespec_t mts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &mts);
mach_port_deallocate(mach_task_self(), cclock);
ts->tv_sec = mts.tv_sec;
ts->tv_nsec = mts.tv_nsec;
}
#elif defined(__linux__) || defined(__CYGWIN__)
void hdr_gettime(hdr_timespec* t)
{
clock_gettime(CLOCK_MONOTONIC, (struct timespec*)t);
}
#else
#warning "Platform not supported\n"
#endif
|