|  | // Copyright (c) 2019 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef QUICHE_QUIC_CORE_QUIC_TIME_ACCUMULATOR_H_ | 
|  | #define QUICHE_QUIC_CORE_QUIC_TIME_ACCUMULATOR_H_ | 
|  |  | 
|  | #include "quic/core/quic_time.h" | 
|  | #include "quic/platform/api/quic_export.h" | 
|  | #include "quic/platform/api/quic_logging.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | // QuicTimeAccumulator accumulates elapsed times between Start(s) and Stop(s). | 
|  | class QUIC_EXPORT_PRIVATE QuicTimeAccumulator { | 
|  | // TODO(wub): Switch to a data member called kNotRunningSentinel after c++17. | 
|  | static constexpr QuicTime NotRunningSentinel() { | 
|  | return QuicTime::Infinite(); | 
|  | } | 
|  |  | 
|  | public: | 
|  | // True if Started and not Stopped. | 
|  | bool IsRunning() const { return last_start_time_ != NotRunningSentinel(); } | 
|  |  | 
|  | void Start(QuicTime now) { | 
|  | QUICHE_DCHECK(!IsRunning()); | 
|  | last_start_time_ = now; | 
|  | QUICHE_DCHECK(IsRunning()); | 
|  | } | 
|  |  | 
|  | void Stop(QuicTime now) { | 
|  | QUICHE_DCHECK(IsRunning()); | 
|  | if (now > last_start_time_) { | 
|  | total_elapsed_ = total_elapsed_ + (now - last_start_time_); | 
|  | } | 
|  | last_start_time_ = NotRunningSentinel(); | 
|  | QUICHE_DCHECK(!IsRunning()); | 
|  | } | 
|  |  | 
|  | // Get total elapsed time between COMPLETED Start/Stop pairs. | 
|  | QuicTime::Delta GetTotalElapsedTime() const { return total_elapsed_; } | 
|  |  | 
|  | // Get total elapsed time between COMPLETED Start/Stop pairs, plus, if it is | 
|  | // running, the elapsed time between |last_start_time_| and |now|. | 
|  | QuicTime::Delta GetTotalElapsedTime(QuicTime now) const { | 
|  | if (!IsRunning()) { | 
|  | return total_elapsed_; | 
|  | } | 
|  | if (now <= last_start_time_) { | 
|  | return total_elapsed_; | 
|  | } | 
|  | return total_elapsed_ + (now - last_start_time_); | 
|  | } | 
|  |  | 
|  | private: | 
|  | // | 
|  | //                                       |last_start_time_| | 
|  | //                                         | | 
|  | //                                         V | 
|  | // Start => Stop  =>  Start => Stop  =>  Start | 
|  | // |           |      |           | | 
|  | // |___________|  +   |___________|  =   |total_elapsed_| | 
|  | QuicTime::Delta total_elapsed_ = QuicTime::Delta::Zero(); | 
|  | QuicTime last_start_time_ = NotRunningSentinel(); | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_CORE_QUIC_TIME_ACCUMULATOR_H_ |