blob: 078d58a4320d7c12fda12a8a09af613b542ff9c5 [file] [log] [blame]
// Copyright 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 BASE_UTIL_MEMORY_PRESSURE_MULTI_SOURCE_MEMORY_PRESSURE_MONITOR_H_
#define BASE_UTIL_MEMORY_PRESSURE_MULTI_SOURCE_MEMORY_PRESSURE_MONITOR_H_
#include "base/memory/memory_pressure_monitor.h"
#include "base/timer/timer.h"
#include "base/util/memory_pressure/memory_pressure_voter.h"
namespace util {
class SystemMemoryPressureEvaluator;
// This is a specialization of a MemoryPressureMonitor that relies on a set of
// MemoryPressureVoters to determine the memory pressure state. The
// MemoryPressureVoteAggregator is in charge of receiving votes from these
// voters and notifying MemoryPressureListeners of the MemoryPressureLevel via
// the monitor's |dispatch_callback_|. The pressure level is calculated as the
// most critical of all votes collected.
// This class is not thread safe and should be used from a single sequence.
class MultiSourceMemoryPressureMonitor
: public base::MemoryPressureMonitor,
public MemoryPressureVoteAggregator::Delegate {
public:
using MemoryPressureLevel = base::MemoryPressureMonitor::MemoryPressureLevel;
using DispatchCallback = base::MemoryPressureMonitor::DispatchCallback;
MultiSourceMemoryPressureMonitor();
~MultiSourceMemoryPressureMonitor() override;
// Start monitoring memory pressure using the platform-specific voter.
void Start();
// MemoryPressureMonitor implementation.
MemoryPressureLevel GetCurrentPressureLevel() const override;
void SetDispatchCallback(const DispatchCallback& callback) override;
// Creates a MemoryPressureVoter to be owned/used by a source that wishes to
// have input on the overall memory pressure level.
std::unique_ptr<MemoryPressureVoter> CreateVoter();
MemoryPressureVoteAggregator* aggregator_for_testing() {
return &aggregator_;
}
void ResetSystemEvaluatorForTesting();
void SetSystemEvaluator(
std::unique_ptr<SystemMemoryPressureEvaluator> evaluator);
protected:
void StartMetricsTimer();
void StopMetricsTimer();
private:
// Delegate implementation.
void OnMemoryPressureLevelChanged(MemoryPressureLevel level) override;
void OnNotifyListenersRequested() override;
void RecordCurrentPressureLevel();
MemoryPressureLevel current_pressure_level_;
DispatchCallback dispatch_callback_;
MemoryPressureVoteAggregator aggregator_;
std::unique_ptr<SystemMemoryPressureEvaluator> system_evaluator_;
// A periodic timer to record UMA metrics.
base::RepeatingTimer metric_timer_;
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_COPY_AND_ASSIGN(MultiSourceMemoryPressureMonitor);
};
} // namespace util
#endif // BASE_UTIL_MEMORY_PRESSURE_MULTI_SOURCE_MEMORY_PRESSURE_MONITOR_H_