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,TimeTicksLowResolutionNowFunction time_ticks_low_resolution_override)15 ScopedTimeClockOverrides::ScopedTimeClockOverrides(
16 TimeNowFunction time_override,
17 TimeTicksNowFunction time_ticks_override,
18 ThreadTicksNowFunction thread_ticks_override,
19 LiveTicksNowFunction live_ticks_override,
20 TimeTicksLowResolutionNowFunction time_ticks_low_resolution_override) {
21 DCHECK(!overrides_active_);
22 overrides_active_ = true;
23 if (time_override) {
24 internal::g_time_now_function.store(time_override,
25 std::memory_order_relaxed);
26 internal::g_time_now_from_system_time_function.store(
27 time_override, std::memory_order_relaxed);
28 }
29 if (time_ticks_override) {
30 internal::g_time_ticks_now_function.store(time_ticks_override,
31 std::memory_order_relaxed);
32 }
33 if (live_ticks_override) {
34 internal::g_live_ticks_now_function.store(live_ticks_override,
35 std::memory_order_relaxed);
36 }
37 if (thread_ticks_override) {
38 internal::g_thread_ticks_now_function.store(thread_ticks_override,
39 std::memory_order_relaxed);
40 }
41 if (time_ticks_low_resolution_override) {
42 internal::g_time_ticks_low_resolution_now_function.store(
43 time_ticks_low_resolution_override, std::memory_order_relaxed);
44 }
45 }
46
~ScopedTimeClockOverrides()47 ScopedTimeClockOverrides::~ScopedTimeClockOverrides() {
48 internal::g_time_now_function.store(&TimeNowIgnoringOverride);
49 internal::g_time_now_from_system_time_function.store(
50 &TimeNowFromSystemTimeIgnoringOverride);
51 internal::g_time_ticks_now_function.store(&TimeTicksNowIgnoringOverride);
52 internal::g_live_ticks_now_function.store(&LiveTicksNowIgnoringOverride);
53 internal::g_thread_ticks_now_function.store(&ThreadTicksNowIgnoringOverride);
54 internal::g_time_ticks_low_resolution_now_function.store(
55 &TimeTicksLowResolutionNowIgnoringOverride);
56 overrides_active_ = false;
57 }
58
59 } // namespace subtle
60 } // namespace base
61