blob: 90513bc51836ff1483b11a04fba0a257b28f2e3b [file] [log] [blame]
// 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_