1 // Copyright 2018 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_override.h"
6
7 #include "base/check.h"
8
9 namespace base {
10 namespace subtle {
11
12 // static
13 bool ScopedTimeClockOverrides::overrides_active_ = false;
14
ScopedTimeClockOverrides(TimeNowFunction time_override,TimeTicksNowFunction time_ticks_override,ThreadTicksNowFunction thread_ticks_override,LiveTicksNowFunction live_ticks_override)15 ScopedTimeClockOverrides::ScopedTimeClockOverrides(
16 TimeNowFunction time_override,
17 TimeTicksNowFunction time_ticks_override,
18 ThreadTicksNowFunction thread_ticks_override,
19 LiveTicksNowFunction live_ticks_override) {
20 DCHECK(!overrides_active_);
21 overrides_active_ = true;
22 if (time_override) {
23 internal::g_time_now_function.store(time_override,
24 std::memory_order_relaxed);
25 internal::g_time_now_from_system_time_function.store(
26 time_override, std::memory_order_relaxed);
27 }
28 if (time_ticks_override) {
29 internal::g_time_ticks_now_function.store(time_ticks_override,
30 std::memory_order_relaxed);
31 }
32 if (live_ticks_override) {
33 internal::g_live_ticks_now_function.store(live_ticks_override,
34 std::memory_order_relaxed);
35 }
36 if (thread_ticks_override) {
37 internal::g_thread_ticks_now_function.store(thread_ticks_override,
38 std::memory_order_relaxed);
39 }
40 }
41
~ScopedTimeClockOverrides()42 ScopedTimeClockOverrides::~ScopedTimeClockOverrides() {
43 internal::g_time_now_function.store(&TimeNowIgnoringOverride);
44 internal::g_time_now_from_system_time_function.store(
45 &TimeNowFromSystemTimeIgnoringOverride);
46 internal::g_time_ticks_now_function.store(&TimeTicksNowIgnoringOverride);
47 internal::g_live_ticks_now_function.store(&LiveTicksNowIgnoringOverride);
48 internal::g_thread_ticks_now_function.store(&ThreadTicksNowIgnoringOverride);
49 overrides_active_ = false;
50 }
51
52 } // namespace subtle
53 } // namespace base
54