[go: nahoru, domu]

blob: 14b61807b0efd5a68bef4af1c62e9c7f8449d4fc [file] [log] [blame]
Ryan Powell30287d42019-08-15 15:48:321// Copyright 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/util/memory_pressure/multi_source_memory_pressure_monitor.h"
6
7#include "base/bind.h"
8#include "base/logging.h"
9#include "base/metrics/histogram_macros.h"
Ryan Powella68d66fc2019-08-19 21:32:3910#include "base/util/memory_pressure/system_memory_pressure_evaluator.h"
Ryan Powell30287d42019-08-15 15:48:3211
12namespace util {
13
14MultiSourceMemoryPressureMonitor::MultiSourceMemoryPressureMonitor()
15 : current_pressure_level_(
16 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE),
17 dispatch_callback_(base::BindRepeating(
18 &base::MemoryPressureListener::NotifyMemoryPressure)),
19 aggregator_(this) {
Ryan Powella68d66fc2019-08-19 21:32:3920 // This can't be in the parameter list because |sequence_checker_| wouldn't be
21 // available, which would be needed by the |system_evaluator_|'s constructor's
22 // call to CreateVoter().
23 system_evaluator_ =
24 SystemMemoryPressureEvaluator::CreateDefaultSystemEvaluator(this);
Ryan Powell30287d42019-08-15 15:48:3225 StartMetricsTimer();
26}
27
28MultiSourceMemoryPressureMonitor::~MultiSourceMemoryPressureMonitor() = default;
29
30void MultiSourceMemoryPressureMonitor::StartMetricsTimer() {
31 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
32 metric_timer_.Start(
33 FROM_HERE, MemoryPressureMonitor::kUMAMemoryPressureLevelPeriod,
34 BindRepeating(&MemoryPressureMonitor::RecordMemoryPressure,
35 GetCurrentPressureLevel(), /* ticks = */ 1));
36}
37
38void MultiSourceMemoryPressureMonitor::StopMetricsTimer() {
39 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
40 metric_timer_.Stop();
41}
42
43base::MemoryPressureListener::MemoryPressureLevel
44MultiSourceMemoryPressureMonitor::GetCurrentPressureLevel() const {
45 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
46 return current_pressure_level_;
47}
48
49std::unique_ptr<MemoryPressureVoter>
50MultiSourceMemoryPressureMonitor::CreateVoter() {
51 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
52 return std::make_unique<MemoryPressureVoter>(&aggregator_);
53}
54
55void MultiSourceMemoryPressureMonitor::SetDispatchCallback(
56 const DispatchCallback& callback) {
57 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
58 dispatch_callback_ = callback;
59}
60
61void MultiSourceMemoryPressureMonitor::OnMemoryPressureLevelChanged(
62 base::MemoryPressureListener::MemoryPressureLevel level) {
63 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
64 current_pressure_level_ = level;
65}
66
67void MultiSourceMemoryPressureMonitor::OnNotifyListenersRequested() {
68 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
69 dispatch_callback_.Run(current_pressure_level_);
70}
71
Ryan Powella68d66fc2019-08-19 21:32:3972void MultiSourceMemoryPressureMonitor::ResetSystemEvaluatorForTesting() {
73 system_evaluator_.reset();
74}
75
Ryan Powell00e61aea2019-09-04 18:33:4476void MultiSourceMemoryPressureMonitor::SetSystemEvaluator(
77 std::unique_ptr<SystemMemoryPressureEvaluator> evaluator) {
78 DCHECK(!system_evaluator_);
79 system_evaluator_ = std::move(evaluator);
80}
81
Ryan Powell30287d42019-08-15 15:48:3282} // namespace util