[go: nahoru, domu]

blob: 2b9a2c43eb02abc71fd9b171790e8f676c972270 [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 Powell30287d42019-08-15 15:48:3220}
21
Jenny Wong6592dd42019-09-26 17:25:0722MultiSourceMemoryPressureMonitor::~MultiSourceMemoryPressureMonitor() {
23 // Destroy system evaluator early while the remaining members of this class
24 // still exist. MultiSourceMemoryPressureMonitor implements
25 // MemoryPressureVoteAggregator::Delegate, and
26 // delegate_->OnMemoryPressureLevelChanged() gets indirectly called during
27 // ~SystemMemoryPressureEvaluator().
28 system_evaluator_.reset();
29}
Ryan Powell30287d42019-08-15 15:48:3230
Sebastien Marchandc9d4cd12019-10-03 22:48:0131void MultiSourceMemoryPressureMonitor::Start() {
32 system_evaluator_ =
33 SystemMemoryPressureEvaluator::CreateDefaultSystemEvaluator(this);
34 StartMetricsTimer();
35}
36
Ryan Powell30287d42019-08-15 15:48:3237void MultiSourceMemoryPressureMonitor::StartMetricsTimer() {
38 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Ryan Powellbdc27592019-09-04 22:59:3939 // Unretained is safe here since this task is running on a timer owned by this
40 // object.
Ryan Powell30287d42019-08-15 15:48:3241 metric_timer_.Start(
42 FROM_HERE, MemoryPressureMonitor::kUMAMemoryPressureLevelPeriod,
Ryan Powellbdc27592019-09-04 22:59:3943 BindRepeating(
44 &MultiSourceMemoryPressureMonitor::RecordCurrentPressureLevel,
45 base::Unretained(this)));
Ryan Powell30287d42019-08-15 15:48:3246}
47
48void MultiSourceMemoryPressureMonitor::StopMetricsTimer() {
49 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
50 metric_timer_.Stop();
51}
52
Ryan Powellbdc27592019-09-04 22:59:3953void MultiSourceMemoryPressureMonitor::RecordCurrentPressureLevel() {
54 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
55 RecordMemoryPressure(GetCurrentPressureLevel(), /* ticks = */ 1);
56}
57
Ryan Powell30287d42019-08-15 15:48:3258base::MemoryPressureListener::MemoryPressureLevel
59MultiSourceMemoryPressureMonitor::GetCurrentPressureLevel() const {
60 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
61 return current_pressure_level_;
62}
63
64std::unique_ptr<MemoryPressureVoter>
65MultiSourceMemoryPressureMonitor::CreateVoter() {
66 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
67 return std::make_unique<MemoryPressureVoter>(&aggregator_);
68}
69
70void MultiSourceMemoryPressureMonitor::SetDispatchCallback(
71 const DispatchCallback& callback) {
72 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
73 dispatch_callback_ = callback;
74}
75
76void MultiSourceMemoryPressureMonitor::OnMemoryPressureLevelChanged(
77 base::MemoryPressureListener::MemoryPressureLevel level) {
78 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
79 current_pressure_level_ = level;
80}
81
82void MultiSourceMemoryPressureMonitor::OnNotifyListenersRequested() {
83 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
84 dispatch_callback_.Run(current_pressure_level_);
85}
86
Ryan Powella68d66fc2019-08-19 21:32:3987void MultiSourceMemoryPressureMonitor::ResetSystemEvaluatorForTesting() {
88 system_evaluator_.reset();
89}
90
Ryan Powell00e61aea2019-09-04 18:33:4491void MultiSourceMemoryPressureMonitor::SetSystemEvaluator(
92 std::unique_ptr<SystemMemoryPressureEvaluator> evaluator) {
93 DCHECK(!system_evaluator_);
94 system_evaluator_ = std::move(evaluator);
95}
96
Ryan Powell30287d42019-08-15 15:48:3297} // namespace util