1 // Copyright 2017 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/time/time.h" 6 7 #include <threads.h> 8 #include <zircon/syscalls.h> 9 #include <zircon/threads.h> 10 11 #include "base/check_op.h" 12 #include "base/fuchsia/fuchsia_logging.h" 13 #include "base/time/time_override.h" 14 15 namespace base { 16 17 // Time ----------------------------------------------------------------------- 18 19 namespace subtle { TimeNowIgnoringOverride()20Time TimeNowIgnoringOverride() { 21 timespec ts; 22 int status = timespec_get(&ts, TIME_UTC); 23 CHECK(status != 0); 24 return Time::FromTimeSpec(ts); 25 } 26 TimeNowFromSystemTimeIgnoringOverride()27Time TimeNowFromSystemTimeIgnoringOverride() { 28 // Just use TimeNowIgnoringOverride() because it returns the system time. 29 return TimeNowIgnoringOverride(); 30 } 31 } // namespace subtle 32 33 // TimeTicks ------------------------------------------------------------------ 34 35 namespace subtle { TimeTicksNowIgnoringOverride()36TimeTicks TimeTicksNowIgnoringOverride() { 37 const zx_time_t nanos_since_boot = zx_clock_get_monotonic(); 38 CHECK_NE(0, nanos_since_boot); 39 return TimeTicks::FromZxTime(nanos_since_boot); 40 } 41 TimeTicksLowResolutionNowIgnoringOverride()42TimeTicks TimeTicksLowResolutionNowIgnoringOverride() { 43 return TimeTicksNowIgnoringOverride(); 44 } 45 } // namespace subtle 46 47 // static FromZxDuration(zx_duration_t nanos)48TimeDelta TimeDelta::FromZxDuration(zx_duration_t nanos) { 49 return Nanoseconds(nanos); 50 } 51 ToZxDuration() const52zx_duration_t TimeDelta::ToZxDuration() const { 53 return InNanoseconds(); 54 } 55 56 // static FromZxTime(zx_time_t nanos_since_unix_epoch)57Time Time::FromZxTime(zx_time_t nanos_since_unix_epoch) { 58 return UnixEpoch() + Nanoseconds(nanos_since_unix_epoch); 59 } 60 ToZxTime() const61zx_time_t Time::ToZxTime() const { 62 return (*this - UnixEpoch()).InNanoseconds(); 63 } 64 65 // static GetClock()66TimeTicks::Clock TimeTicks::GetClock() { 67 return Clock::FUCHSIA_ZX_CLOCK_MONOTONIC; 68 } 69 70 // static IsHighResolution()71bool TimeTicks::IsHighResolution() { 72 return true; 73 } 74 75 // static IsConsistentAcrossProcesses()76bool TimeTicks::IsConsistentAcrossProcesses() { 77 return true; 78 } 79 80 // static FromZxTime(zx_time_t nanos_since_boot)81TimeTicks TimeTicks::FromZxTime(zx_time_t nanos_since_boot) { 82 return TimeTicks() + Nanoseconds(nanos_since_boot); 83 } 84 ToZxTime() const85zx_time_t TimeTicks::ToZxTime() const { 86 return (*this - TimeTicks()).InNanoseconds(); 87 } 88 89 // ThreadTicks ---------------------------------------------------------------- 90 91 namespace subtle { ThreadTicksNowIgnoringOverride()92ThreadTicks ThreadTicksNowIgnoringOverride() { 93 zx_info_thread_stats_t info; 94 zx_status_t status = zx_object_get_info(thrd_get_zx_handle(thrd_current()), 95 ZX_INFO_THREAD_STATS, &info, 96 sizeof(info), nullptr, nullptr); 97 ZX_CHECK(status == ZX_OK, status); 98 return ThreadTicks() + Nanoseconds(info.total_runtime); 99 } 100 } // namespace subtle 101 102 } // namespace base 103