| // Copyright 2021 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 COMPONENTS_MEMORY_PRESSURE_MEMORY_PRESSURE_LEVEL_REPORTER_H_ |
| #define COMPONENTS_MEMORY_PRESSURE_MEMORY_PRESSURE_LEVEL_REPORTER_H_ |
| |
| #include <array> |
| |
| #include "base/memory/memory_pressure_listener.h" |
| #include "base/time/time.h" |
| #include "base/timer/timer.h" |
| |
| namespace memory_pressure { |
| |
| // Report metrics related to memory pressure. |
| class MemoryPressureLevelReporter { |
| public: |
| using MemoryPressureLevel = base::MemoryPressureListener::MemoryPressureLevel; |
| |
| explicit MemoryPressureLevelReporter( |
| MemoryPressureLevel initial_pressure_level); |
| ~MemoryPressureLevelReporter(); |
| |
| // Should be called whenever the current memory pressure level changes. |
| void OnMemoryPressureLevelChanged(MemoryPressureLevel new_level); |
| |
| private: |
| void ReportHistogram(base::TimeTicks now); |
| void StartPeriodicTimer(); |
| |
| MemoryPressureLevel current_pressure_level_; |
| base::TimeTicks current_pressure_level_begin_ = base::TimeTicks::Now(); |
| |
| // The reporting of the pressure level histogram is done in seconds, the |
| // duration in a given pressure state will be floored. This means that some |
| // time will be truncated each time we send a report. This array is used to |
| // accumulate the truncated time and add it to the reported value when it |
| // exceeds one second. |
| std::array<base::TimeDelta, MemoryPressureLevel::kMaxValue + 1> |
| accumulator_buckets_; |
| |
| // Timer used to ensure a periodic reporting of the pressure level metric. |
| // Without this there's a risk that a browser crash will cause some data to |
| // be lost. |
| base::OneShotTimer periodic_reporting_timer_; |
| }; |
| |
| } // namespace memory_pressure |
| |
| #endif // COMPONENTS_MEMORY_PRESSURE_MEMORY_PRESSURE_LEVEL_REPORTER_H_ |