• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2024 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 "components/network_time/time_tracker/time_tracker.h"
6 
7 #include "base/logging.h"
8 
9 namespace {
10 // Amount of divergence allowed between wall clock and tick clock.
11 const uint32_t kClockDivergenceSeconds = 60;
12 }  // namespace
13 
14 namespace network_time {
TimeTracker(const base::Time & system_time,const base::TimeTicks & system_ticks,const base::Time & time,const base::TimeDelta & uncertainty)15 TimeTracker::TimeTracker(const base::Time& system_time,
16                          const base::TimeTicks& system_ticks,
17                          const base::Time& time,
18                          const base::TimeDelta& uncertainty)
19     : state_{system_time, system_ticks, time, uncertainty} {}
20 
GetTime(const base::Time & system_time,const base::TimeTicks & system_ticks,base::Time * time,base::TimeDelta * uncertainty) const21 bool TimeTracker::GetTime(const base::Time& system_time,
22                           const base::TimeTicks& system_ticks,
23                           base::Time* time,
24                           base::TimeDelta* uncertainty) const {
25   base::TimeDelta tick_delta = system_ticks - state_.system_ticks;
26   base::TimeDelta time_delta = system_time - state_.system_time;
27   if (time_delta.InMilliseconds() < 0) {
28     DVLOG(1) << "Time unavailable due to wall clock running backward";
29     return false;
30   }
31 
32   base::TimeDelta divergence = tick_delta - time_delta;
33   if (divergence.magnitude() > base::Seconds(kClockDivergenceSeconds)) {
34     DVLOG(1) << "Time unavailable due to clocks diverging";
35     return false;
36   }
37   *time = state_.known_time + tick_delta;
38   if (uncertainty) {
39     *uncertainty = state_.uncertainty + divergence;
40   }
41   return true;
42 }
43 
44 }  // namespace network_time
45