1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TIME_TIME_OVERRIDE_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TIME_TIME_OVERRIDE_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <atomic> 9*6777b538SAndroid Build Coastguard Worker #include <optional> 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker namespace base { 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker using TimeNowFunction = decltype(&Time::Now); 18*6777b538SAndroid Build Coastguard Worker using TimeTicksNowFunction = decltype(&TimeTicks::Now); 19*6777b538SAndroid Build Coastguard Worker using LiveTicksNowFunction = decltype(&LiveTicks::Now); 20*6777b538SAndroid Build Coastguard Worker using ThreadTicksNowFunction = decltype(&ThreadTicks::Now); 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // Time overrides should be used with extreme caution. Discuss with //base/time 23*6777b538SAndroid Build Coastguard Worker // OWNERS before adding a new one. 24*6777b538SAndroid Build Coastguard Worker namespace subtle { 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker // Override the return value of Time::Now and Time::NowFromSystemTime / 27*6777b538SAndroid Build Coastguard Worker // TimeTicks::Now / LiveTicks::Now / ThreadTicks::Now to emulate time, e.g. for 28*6777b538SAndroid Build Coastguard Worker // tests or to modify progression of time. It is recommended that the override 29*6777b538SAndroid Build Coastguard Worker // be set while single-threaded and before the first call to Now() to avoid 30*6777b538SAndroid Build Coastguard Worker // threading issues and inconsistencies in returned values. Overriding time 31*6777b538SAndroid Build Coastguard Worker // while other threads are running is very subtle and should be reserved for 32*6777b538SAndroid Build Coastguard Worker // developer only use cases (e.g. virtual time in devtools) where any flakiness 33*6777b538SAndroid Build Coastguard Worker // caused by a racy time update isn't surprising. Instantiating a 34*6777b538SAndroid Build Coastguard Worker // ScopedTimeClockOverrides while other threads are running might break their 35*6777b538SAndroid Build Coastguard Worker // expectation that TimeTicks and ThreadTicks increase monotonically. Nested 36*6777b538SAndroid Build Coastguard Worker // overrides are not allowed. 37*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ScopedTimeClockOverrides { 38*6777b538SAndroid Build Coastguard Worker public: 39*6777b538SAndroid Build Coastguard Worker // Pass |nullptr| for any override if it shouldn't be overriden. 40*6777b538SAndroid Build Coastguard Worker ScopedTimeClockOverrides(TimeNowFunction time_override, 41*6777b538SAndroid Build Coastguard Worker TimeTicksNowFunction time_ticks_override, 42*6777b538SAndroid Build Coastguard Worker ThreadTicksNowFunction thread_ticks_override, 43*6777b538SAndroid Build Coastguard Worker LiveTicksNowFunction live_ticks_override = nullptr); 44*6777b538SAndroid Build Coastguard Worker 45*6777b538SAndroid Build Coastguard Worker ScopedTimeClockOverrides(const ScopedTimeClockOverrides&) = delete; 46*6777b538SAndroid Build Coastguard Worker ScopedTimeClockOverrides& operator=(const ScopedTimeClockOverrides&) = delete; 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Restores the platform default Now() functions. 49*6777b538SAndroid Build Coastguard Worker ~ScopedTimeClockOverrides(); 50*6777b538SAndroid Build Coastguard Worker overrides_active()51*6777b538SAndroid Build Coastguard Worker static bool overrides_active() { return overrides_active_; } 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker private: 54*6777b538SAndroid Build Coastguard Worker static bool overrides_active_; 55*6777b538SAndroid Build Coastguard Worker }; 56*6777b538SAndroid Build Coastguard Worker 57*6777b538SAndroid Build Coastguard Worker // These methods return the platform default Time::Now / TimeTicks::Now / 58*6777b538SAndroid Build Coastguard Worker // ThreadTicks::Now values even while an override is in place. These methods 59*6777b538SAndroid Build Coastguard Worker // should only be used in places where emulated time should be disregarded. For 60*6777b538SAndroid Build Coastguard Worker // example, they can be used to implement test timeouts for tests that may 61*6777b538SAndroid Build Coastguard Worker // override time. 62*6777b538SAndroid Build Coastguard Worker BASE_EXPORT Time TimeNowIgnoringOverride(); 63*6777b538SAndroid Build Coastguard Worker BASE_EXPORT Time TimeNowFromSystemTimeIgnoringOverride(); 64*6777b538SAndroid Build Coastguard Worker BASE_EXPORT TimeTicks TimeTicksNowIgnoringOverride(); 65*6777b538SAndroid Build Coastguard Worker BASE_EXPORT LiveTicks LiveTicksNowIgnoringOverride(); 66*6777b538SAndroid Build Coastguard Worker BASE_EXPORT ThreadTicks ThreadTicksNowIgnoringOverride(); 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_POSIX) 69*6777b538SAndroid Build Coastguard Worker // Equivalent to TimeTicksNowIgnoringOverride(), but is allowed to fail and 70*6777b538SAndroid Build Coastguard Worker // return std::nullopt. This may safely be used in a signal handler. 71*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::optional<TimeTicks> MaybeTimeTicksNowIgnoringOverride(); 72*6777b538SAndroid Build Coastguard Worker #endif 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker } // namespace subtle 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker namespace internal { 77*6777b538SAndroid Build Coastguard Worker 78*6777b538SAndroid Build Coastguard Worker // These function pointers are used by platform-independent implementations of 79*6777b538SAndroid Build Coastguard Worker // the Now() methods and ScopedTimeClockOverrides. They are set to point to the 80*6777b538SAndroid Build Coastguard Worker // respective NowIgnoringOverride functions by default, but can also be set by 81*6777b538SAndroid Build Coastguard Worker // platform-specific code to select a default implementation at runtime, thereby 82*6777b538SAndroid Build Coastguard Worker // avoiding the indirection via the NowIgnoringOverride functions. Note that the 83*6777b538SAndroid Build Coastguard Worker // pointers can be overridden and later reset to the NowIgnoringOverride 84*6777b538SAndroid Build Coastguard Worker // functions by ScopedTimeClockOverrides. 85*6777b538SAndroid Build Coastguard Worker extern std::atomic<TimeNowFunction> g_time_now_function; 86*6777b538SAndroid Build Coastguard Worker extern std::atomic<TimeNowFunction> g_time_now_from_system_time_function; 87*6777b538SAndroid Build Coastguard Worker extern std::atomic<TimeTicksNowFunction> g_time_ticks_now_function; 88*6777b538SAndroid Build Coastguard Worker extern std::atomic<LiveTicksNowFunction> g_live_ticks_now_function; 89*6777b538SAndroid Build Coastguard Worker extern std::atomic<ThreadTicksNowFunction> g_thread_ticks_now_function; 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker } // namespace internal 92*6777b538SAndroid Build Coastguard Worker 93*6777b538SAndroid Build Coastguard Worker } // namespace base 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker #endif // BASE_TIME_TIME_OVERRIDE_H_ 96