[go: nahoru, domu]

blob: 3b94a779ce9678af9d8ecf574d8f336847b0df43 [file] [log] [blame]
Avi Drissman8ba1bad2022-09-13 19:22:361// Copyright 2019 The Chromium Authors
Ryan Powell30287d42019-08-15 15:48:322// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Albert J. Wong23183a12021-08-13 00:23:355#include "components/memory_pressure/multi_source_memory_pressure_monitor.h"
Ryan Powell30287d42019-08-15 15:48:326
Hans Wennborgc3cffa62020-04-27 10:09:127#include "base/check_op.h"
Avi Drissman12be0312023-01-11 09:16:098#include "base/functional/bind.h"
Sebastien Marchand6c5354e2020-02-07 19:38:259#include "base/metrics/histogram_functions.h"
Ryan Powell30287d42019-08-15 15:48:3210#include "base/metrics/histogram_macros.h"
Sebastien Marchand6c5354e2020-02-07 19:38:2511#include "base/time/time.h"
Eric Secklerf6c544f2020-06-02 10:49:2112#include "base/trace_event/base_tracing.h"
ssid8734ea72021-03-17 18:43:5813#include "base/tracing_buildflags.h"
Albert J. Wong23183a12021-08-13 00:23:3514#include "components/memory_pressure/system_memory_pressure_evaluator.h"
Ryan Powell30287d42019-08-15 15:48:3215
ssid8734ea72021-03-17 18:43:5816#if BUILDFLAG(ENABLE_BASE_TRACING)
17#include "base/trace_event/memory_pressure_level_proto.h" // no-presubmit-check
18#endif
19
Albert J. Wong23183a12021-08-13 00:23:3520namespace memory_pressure {
Ryan Powell30287d42019-08-15 15:48:3221
22MultiSourceMemoryPressureMonitor::MultiSourceMemoryPressureMonitor()
23 : current_pressure_level_(
24 base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE),
25 dispatch_callback_(base::BindRepeating(
26 &base::MemoryPressureListener::NotifyMemoryPressure)),
Sebastien Marchandfcd25482021-05-03 16:19:4627 aggregator_(this),
28 level_reporter_(current_pressure_level_) {}
Ryan Powell30287d42019-08-15 15:48:3229
Jenny Wong6592dd42019-09-26 17:25:0730MultiSourceMemoryPressureMonitor::~MultiSourceMemoryPressureMonitor() {
31 // Destroy system evaluator early while the remaining members of this class
32 // still exist. MultiSourceMemoryPressureMonitor implements
33 // MemoryPressureVoteAggregator::Delegate, and
34 // delegate_->OnMemoryPressureLevelChanged() gets indirectly called during
35 // ~SystemMemoryPressureEvaluator().
36 system_evaluator_.reset();
37}
Ryan Powell30287d42019-08-15 15:48:3238
Patrick Monette216bbdc32023-02-17 22:27:0039void MultiSourceMemoryPressureMonitor::MaybeStartPlatformVoter() {
Sebastien Marchandc9d4cd12019-10-03 22:48:0140 system_evaluator_ =
41 SystemMemoryPressureEvaluator::CreateDefaultSystemEvaluator(this);
Ryan Powellbdc27592019-09-04 22:59:3942}
43
Ryan Powell30287d42019-08-15 15:48:3244base::MemoryPressureListener::MemoryPressureLevel
45MultiSourceMemoryPressureMonitor::GetCurrentPressureLevel() const {
46 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
47 return current_pressure_level_;
48}
49
50std::unique_ptr<MemoryPressureVoter>
51MultiSourceMemoryPressureMonitor::CreateVoter() {
52 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Wez861e2922020-03-01 21:14:0053 return aggregator_.CreateVoter();
Ryan Powell30287d42019-08-15 15:48:3254}
55
Ryan Powell30287d42019-08-15 15:48:3256void MultiSourceMemoryPressureMonitor::OnMemoryPressureLevelChanged(
57 base::MemoryPressureListener::MemoryPressureLevel level) {
58 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
Sebastien Marchand6c5354e2020-02-07 19:38:2559 DCHECK_NE(current_pressure_level_, level);
60
Sebastien Marchandfcd25482021-05-03 16:19:4661 level_reporter_.OnMemoryPressureLevelChanged(level);
62
ssidfff7ab42021-03-04 20:03:1163 TRACE_EVENT_INSTANT(
Sebastien Marchand9df1f3d2020-03-23 18:54:3164 "base", "MultiSourceMemoryPressureMonitor::OnMemoryPressureLevelChanged",
ssidfff7ab42021-03-04 20:03:1165 [&](perfetto::EventContext ctx) {
66 auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
67 auto* data = event->set_chrome_memory_pressure_notification();
ssid8734ea72021-03-17 18:43:5868 data->set_level(
69 base::trace_event::MemoryPressureLevelToTraceEnum(level));
ssidfff7ab42021-03-04 20:03:1170 });
Sebastien Marchand9df1f3d2020-03-23 18:54:3171
Ryan Powell30287d42019-08-15 15:48:3272 current_pressure_level_ = level;
73}
74
75void MultiSourceMemoryPressureMonitor::OnNotifyListenersRequested() {
76 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
77 dispatch_callback_.Run(current_pressure_level_);
78}
79
Ryan Powell00e61aea2019-09-04 18:33:4480void MultiSourceMemoryPressureMonitor::SetSystemEvaluator(
81 std::unique_ptr<SystemMemoryPressureEvaluator> evaluator) {
82 DCHECK(!system_evaluator_);
83 system_evaluator_ = std::move(evaluator);
84}
85
Patrick Monette216bbdc32023-02-17 22:27:0086void MultiSourceMemoryPressureMonitor::SetDispatchCallbackForTesting(
87 const DispatchCallback& callback) {
88 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
89 // Must be called before `Start()`.
90 DCHECK(!system_evaluator_);
91 dispatch_callback_ = callback;
92}
93
Albert J. Wong23183a12021-08-13 00:23:3594} // namespace memory_pressure