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