1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 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_TIMER_ELAPSED_TIMER_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TIMER_ELAPSED_TIMER_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h" 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Worker namespace base { 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker // A simple wrapper around TimeTicks::Now(). 14*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ElapsedTimer { 15*6777b538SAndroid Build Coastguard Worker public: 16*6777b538SAndroid Build Coastguard Worker ElapsedTimer(); 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker ElapsedTimer(const ElapsedTimer&) = delete; 19*6777b538SAndroid Build Coastguard Worker ElapsedTimer& operator=(const ElapsedTimer&) = delete; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker ElapsedTimer(ElapsedTimer&& other); 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker void operator=(ElapsedTimer&& other); 24*6777b538SAndroid Build Coastguard Worker 25*6777b538SAndroid Build Coastguard Worker // Returns the time elapsed since object construction. 26*6777b538SAndroid Build Coastguard Worker TimeDelta Elapsed() const; 27*6777b538SAndroid Build Coastguard Worker 28*6777b538SAndroid Build Coastguard Worker // Returns the timestamp of the creation of this timer. start_time()29*6777b538SAndroid Build Coastguard Worker TimeTicks start_time() const { return start_time_; } 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker private: 32*6777b538SAndroid Build Coastguard Worker TimeTicks start_time_; 33*6777b538SAndroid Build Coastguard Worker }; 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // A simple wrapper around ThreadTicks::Now(). 36*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ElapsedThreadTimer { 37*6777b538SAndroid Build Coastguard Worker public: 38*6777b538SAndroid Build Coastguard Worker ElapsedThreadTimer(); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker ElapsedThreadTimer(const ElapsedThreadTimer&) = delete; 41*6777b538SAndroid Build Coastguard Worker ElapsedThreadTimer& operator=(const ElapsedThreadTimer&) = delete; 42*6777b538SAndroid Build Coastguard Worker 43*6777b538SAndroid Build Coastguard Worker // Returns the ThreadTicks time elapsed since object construction. 44*6777b538SAndroid Build Coastguard Worker // Only valid if |is_supported()| returns true, otherwise returns TimeDelta(). 45*6777b538SAndroid Build Coastguard Worker TimeDelta Elapsed() const; 46*6777b538SAndroid Build Coastguard Worker is_supported()47*6777b538SAndroid Build Coastguard Worker bool is_supported() const { return is_supported_; } 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker private: 50*6777b538SAndroid Build Coastguard Worker const bool is_supported_; 51*6777b538SAndroid Build Coastguard Worker const ThreadTicks begin_; 52*6777b538SAndroid Build Coastguard Worker }; 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker // Whenever there's a ScopedMockElapsedTimersForTest in scope, 55*6777b538SAndroid Build Coastguard Worker // Elapsed(Thread)Timers will always return kMockElapsedTime from Elapsed(). 56*6777b538SAndroid Build Coastguard Worker // This is useful, for example, in unit tests that verify that their impl 57*6777b538SAndroid Build Coastguard Worker // records timing histograms. It enables such tests to observe reliable timings. 58*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT ScopedMockElapsedTimersForTest { 59*6777b538SAndroid Build Coastguard Worker public: 60*6777b538SAndroid Build Coastguard Worker static constexpr TimeDelta kMockElapsedTime = Milliseconds(1337); 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // ScopedMockElapsedTimersForTest is not thread-safe (it must be instantiated 63*6777b538SAndroid Build Coastguard Worker // in a test before other threads begin using ElapsedTimers; and it must 64*6777b538SAndroid Build Coastguard Worker // conversely outlive any usage of ElapsedTimer in that test). 65*6777b538SAndroid Build Coastguard Worker ScopedMockElapsedTimersForTest(); 66*6777b538SAndroid Build Coastguard Worker 67*6777b538SAndroid Build Coastguard Worker ScopedMockElapsedTimersForTest(const ScopedMockElapsedTimersForTest&) = 68*6777b538SAndroid Build Coastguard Worker delete; 69*6777b538SAndroid Build Coastguard Worker ScopedMockElapsedTimersForTest& operator=( 70*6777b538SAndroid Build Coastguard Worker const ScopedMockElapsedTimersForTest&) = delete; 71*6777b538SAndroid Build Coastguard Worker 72*6777b538SAndroid Build Coastguard Worker ~ScopedMockElapsedTimersForTest(); 73*6777b538SAndroid Build Coastguard Worker }; 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker } // namespace base 76*6777b538SAndroid Build Coastguard Worker 77*6777b538SAndroid Build Coastguard Worker #endif // BASE_TIMER_ELAPSED_TIMER_H_ 78