| // Copyright 2024 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/network_time/time_tracker/time_tracker.h" |
| |
| #include "base/logging.h" |
| |
| namespace { |
| // Amount of divergence allowed between wall clock and tick clock. |
| const uint32_t kClockDivergenceSeconds = 60; |
| } // namespace |
| |
| namespace network_time { |
| TimeTracker::TimeTracker(const base::Time& system_time, |
| const base::TimeTicks& system_ticks, |
| const base::Time& time, |
| const base::TimeDelta& uncertainty) |
| : state_{system_time, system_ticks, time, uncertainty} {} |
| |
| bool TimeTracker::GetTime(const base::Time& system_time, |
| const base::TimeTicks& system_ticks, |
| base::Time* time, |
| base::TimeDelta* uncertainty) const { |
| base::TimeDelta tick_delta = system_ticks - state_.system_ticks; |
| base::TimeDelta time_delta = system_time - state_.system_time; |
| if (time_delta.InMilliseconds() < 0) { |
| DVLOG(1) << "Time unavailable due to wall clock running backward"; |
| return false; |
| } |
| |
| base::TimeDelta divergence = tick_delta - time_delta; |
| if (divergence.magnitude() > base::Seconds(kClockDivergenceSeconds)) { |
| DVLOG(1) << "Time unavailable due to clocks diverging"; |
| return false; |
| } |
| *time = state_.known_time + tick_delta; |
| if (uncertainty) { |
| *uncertainty = state_.uncertainty + divergence; |
| } |
| return true; |
| } |
| |
| } // namespace network_time |