xref: /aosp_15_r20/external/cronet/base/time/time_fuchsia.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 Worker Time 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 Worker Time 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 Worker TimeTicks 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 Worker TimeDelta 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 Worker zx_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 Worker Time 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 Worker zx_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 Worker TimeTicks::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 Worker bool 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 Worker bool 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 Worker TimeTicks 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 Worker zx_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 Worker ThreadTicks 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