• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()20 Time TimeNowIgnoringOverride() {
21   timespec ts;
22   int status = timespec_get(&ts, TIME_UTC);
23   CHECK(status != 0);
24   return Time::FromTimeSpec(ts);
25 }
26 
TimeNowFromSystemTimeIgnoringOverride()27 Time 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()36 TimeTicks 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()42 TimeTicks TimeTicksLowResolutionNowIgnoringOverride() {
43   return TimeTicksNowIgnoringOverride();
44 }
45 }  // namespace subtle
46 
47 // static
FromZxDuration(zx_duration_t nanos)48 TimeDelta TimeDelta::FromZxDuration(zx_duration_t nanos) {
49   return Nanoseconds(nanos);
50 }
51 
ToZxDuration() const52 zx_duration_t TimeDelta::ToZxDuration() const {
53   return InNanoseconds();
54 }
55 
56 // static
FromZxTime(zx_time_t nanos_since_unix_epoch)57 Time Time::FromZxTime(zx_time_t nanos_since_unix_epoch) {
58   return UnixEpoch() + Nanoseconds(nanos_since_unix_epoch);
59 }
60 
ToZxTime() const61 zx_time_t Time::ToZxTime() const {
62   return (*this - UnixEpoch()).InNanoseconds();
63 }
64 
65 // static
GetClock()66 TimeTicks::Clock TimeTicks::GetClock() {
67   return Clock::FUCHSIA_ZX_CLOCK_MONOTONIC;
68 }
69 
70 // static
IsHighResolution()71 bool TimeTicks::IsHighResolution() {
72   return true;
73 }
74 
75 // static
IsConsistentAcrossProcesses()76 bool TimeTicks::IsConsistentAcrossProcesses() {
77   return true;
78 }
79 
80 // static
FromZxTime(zx_time_t nanos_since_boot)81 TimeTicks TimeTicks::FromZxTime(zx_time_t nanos_since_boot) {
82   return TimeTicks() + Nanoseconds(nanos_since_boot);
83 }
84 
ToZxTime() const85 zx_time_t TimeTicks::ToZxTime() const {
86   return (*this - TimeTicks()).InNanoseconds();
87 }
88 
89 // ThreadTicks ----------------------------------------------------------------
90 
91 namespace subtle {
ThreadTicksNowIgnoringOverride()92 ThreadTicks 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