1 #ifndef ANDROID_DVR_CLOCK_NS_H_
2 #define ANDROID_DVR_CLOCK_NS_H_
3
4 #include <stdint.h>
5 #include <time.h>
6
7 namespace android {
8 namespace dvr {
9
10 constexpr int64_t kNanosPerSecond = 1000000000ll;
11
12 // Returns the standard Dream OS monotonic system time that corresponds with all
13 // timestamps found in Dream OS APIs.
GetSystemClock()14 static inline timespec GetSystemClock() {
15 timespec t;
16 clock_gettime(CLOCK_MONOTONIC, &t);
17 return t;
18 }
19
GetSystemClockRaw()20 static inline timespec GetSystemClockRaw() {
21 timespec t;
22 clock_gettime(CLOCK_MONOTONIC_RAW, &t);
23 return t;
24 }
25
GetSystemClockNs()26 static inline int64_t GetSystemClockNs() {
27 timespec t = GetSystemClock();
28 int64_t ns = kNanosPerSecond * (int64_t)t.tv_sec + (int64_t)t.tv_nsec;
29 return ns;
30 }
31
GetSystemClockRawNs()32 static inline int64_t GetSystemClockRawNs() {
33 timespec t = GetSystemClockRaw();
34 int64_t ns = kNanosPerSecond * (int64_t)t.tv_sec + (int64_t)t.tv_nsec;
35 return ns;
36 }
37
NsToSec(int64_t nanoseconds)38 static inline double NsToSec(int64_t nanoseconds) {
39 return nanoseconds / static_cast<double>(kNanosPerSecond);
40 }
41
GetSystemClockSec()42 static inline double GetSystemClockSec() { return NsToSec(GetSystemClockNs()); }
43
GetSystemClockMs()44 static inline double GetSystemClockMs() { return GetSystemClockSec() * 1000.0; }
45
46 // Converts a nanosecond timestamp to a timespec. Based on the kernel function
47 // of the same name.
NsToTimespec(int64_t ns)48 static inline timespec NsToTimespec(int64_t ns) {
49 timespec t;
50 int32_t remainder;
51
52 t.tv_sec = ns / kNanosPerSecond;
53 remainder = ns % kNanosPerSecond;
54 if (remainder < 0) {
55 t.tv_nsec--;
56 remainder += kNanosPerSecond;
57 }
58 t.tv_nsec = remainder;
59
60 return t;
61 }
62
63 // Timestamp comparison functions that handle wrapping values correctly.
TimestampLT(int64_t a,int64_t b)64 static inline bool TimestampLT(int64_t a, int64_t b) {
65 return static_cast<int64_t>(static_cast<uint64_t>(a) -
66 static_cast<uint64_t>(b)) < 0;
67 }
TimestampLE(int64_t a,int64_t b)68 static inline bool TimestampLE(int64_t a, int64_t b) {
69 return static_cast<int64_t>(static_cast<uint64_t>(a) -
70 static_cast<uint64_t>(b)) <= 0;
71 }
TimestampGT(int64_t a,int64_t b)72 static inline bool TimestampGT(int64_t a, int64_t b) {
73 return static_cast<int64_t>(static_cast<uint64_t>(a) -
74 static_cast<uint64_t>(b)) > 0;
75 }
TimestampGE(int64_t a,int64_t b)76 static inline bool TimestampGE(int64_t a, int64_t b) {
77 return static_cast<int64_t>(static_cast<uint64_t>(a) -
78 static_cast<uint64_t>(b)) >= 0;
79 }
80
81 } // namespace dvr
82 } // namespace android
83
84 #endif // ANDROID_DVR_CLOCK_NS_H_
85