12inline timespec NowSpec()
15 clock_gettime(CLOCK_MONOTONIC, &ts);
19inline uint64_t NowMilliseconds()
21 const timespec ts = NowSpec();
22 return static_cast<uint64_t
>(ts.tv_sec) * 1000ULL +
23 static_cast<uint64_t
>(ts.tv_nsec) / 1000000ULL;
26inline timespec RelativeFromMilliseconds(uint32_t milliseconds)
29 ts.tv_sec =
static_cast<time_t
>(milliseconds / 1000U);
30 ts.tv_nsec =
static_cast<long>(milliseconds % 1000U) * 1000000L;
34inline timespec AddMilliseconds(timespec base, uint64_t milliseconds)
36 base.tv_sec +=
static_cast<time_t
>(milliseconds / 1000ULL);
37 base.tv_nsec +=
static_cast<long>(milliseconds % 1000ULL) * 1000000L;
38 if (base.tv_nsec >= 1000000000L)
40 base.tv_sec += base.tv_nsec / 1000000000L;
41 base.tv_nsec %= 1000000000L;
46inline uint32_t RemainingMilliseconds(uint64_t deadline_ms)
48 const uint64_t now_ms = NowMilliseconds();
49 if (now_ms >= deadline_ms)
53 return static_cast<uint32_t
>(deadline_ms - now_ms);
56inline int64_t ElapsedMicroseconds(
const timespec& start)
58 const timespec now = NowSpec();
59 return static_cast<int64_t
>(now.tv_sec - start.tv_sec) * 1000000LL +
60 static_cast<int64_t
>(now.tv_nsec - start.tv_nsec) / 1000LL;
63inline uint32_t WaitSliceMilliseconds(uint32_t remaining_ms)