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