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. 14 static inline timespec GetSystemClock() { 15 timespec t; 16 clock_gettime(CLOCK_MONOTONIC, &t); 17 return t; 18 } 19 20 static inline timespec GetSystemClockRaw() { 21 timespec t; 22 clock_gettime(CLOCK_MONOTONIC_RAW, &t); 23 return t; 24 } 25 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 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 38 static inline double NsToSec(int64_t nanoseconds) { 39 return nanoseconds / static_cast<double>(kNanosPerSecond); 40 } 41 42 static inline double GetSystemClockSec() { return NsToSec(GetSystemClockNs()); } 43 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. 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. 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 } 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 } 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 } 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