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