blob: 99e5b107dc91705ca2fe1856db592f623611501a (
plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#include "../rust_globals.h"
#include "timer.h"
#if defined(__APPLE__)
#include <mach/mach_time.h>
#endif
uint64_t ns_per_s = 1000000000LL;
timer::timer() {
#if __WIN32__
_ticks_per_s = 0LL;
// FIXME (#2675): assert this works or have a workaround.
QueryPerformanceFrequency((LARGE_INTEGER *)&_ticks_per_s);
if (_ticks_per_s == 0LL) {
_ticks_per_s = 1LL;
}
#endif
reset_us(0);
}
void
timer::reset_us(uint64_t timeout_us) {
_start_us = time_us();
_timeout_us = timeout_us;
}
uint64_t
timer::elapsed_us() {
return time_us() - _start_us;
}
double
timer::elapsed_ms() {
return (double) elapsed_us() / 1000.0;
}
int64_t
timer::remaining_us() {
return _timeout_us - elapsed_us();
}
bool
timer::has_timed_out() {
return remaining_us() <= 0;
}
uint64_t
timer::time_ns() {
#ifdef __APPLE__
uint64_t time = mach_absolute_time();
mach_timebase_info_data_t info = {0, 0};
if (info.denom == 0) {
mach_timebase_info(&info);
}
uint64_t time_nano = time * (info.numer / info.denom);
return time_nano;
#elif __WIN32__
uint64_t ticks;
QueryPerformanceCounter((LARGE_INTEGER *)&ticks);
return ((ticks * ns_per_s) / _ticks_per_s);
#else
timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (ts.tv_sec * ns_per_s + ts.tv_nsec);
#endif
}
uint64_t
timer::time_us() {
return time_ns() / 1000;
}
timer::~timer() {
}
|