| // 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_ |