1 // Copyright 2020 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/memory_pressure/system_memory_pressure_evaluator_fuchsia.h"
7 #include <lib/sys/cpp/component_context.h>
9 #include "base/fuchsia/fuchsia_logging.h"
10 #include "base/fuchsia/process_context.h"
11 #include "base/strings/string_piece.h"
12 #include "base/time/time.h"
13 #include "components/memory_pressure/memory_pressure_voter.h"
15 namespace memory_pressure {
19 base::MemoryPressureListener::MemoryPressureLevel
20 FuchsiaToBaseMemoryPressureLevel(fuchsia::memorypressure::Level level) {
22 case fuchsia::memorypressure::Level::NORMAL:
23 return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
25 case fuchsia::memorypressure::Level::WARNING:
26 return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE;
28 case fuchsia::memorypressure::Level::CRITICAL:
29 return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL;
35 SystemMemoryPressureEvaluatorFuchsia::SystemMemoryPressureEvaluatorFuchsia(
36 std::unique_ptr<memory_pressure::MemoryPressureVoter> voter)
37 : memory_pressure::SystemMemoryPressureEvaluator(std::move(voter)),
39 binding_.set_error_handler(base::LogFidlErrorAndExitProcess(
40 FROM_HERE, "fuchsia.memorypressure.Provider"));
42 DVLOG(1) << "Registering for memory pressure updates.";
43 auto provider = base::ComponentContextForProcess()
45 ->Connect<fuchsia::memorypressure::Provider>();
46 provider->RegisterWatcher(binding_.NewBinding());
49 SystemMemoryPressureEvaluatorFuchsia::~SystemMemoryPressureEvaluatorFuchsia() =
52 void SystemMemoryPressureEvaluatorFuchsia::OnLevelChanged(
53 fuchsia::memorypressure::Level level,
54 OnLevelChangedCallback callback) {
55 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
57 VLOG(1) << "OnLevelChanged: level=" << static_cast<uint32_t>(level);
59 base::MemoryPressureListener::MemoryPressureLevel new_level =
60 FuchsiaToBaseMemoryPressureLevel(level);
62 VLOG(1) << "MemoryPressureLevel: " << new_level;
64 // Set the new vote, and determine whether to notify listeners.
65 SetCurrentVote(new_level);
67 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
68 // By convention no notifications are sent when returning to NONE level.
69 SendCurrentVote(false);
70 renotify_current_vote_timer_.Stop();
72 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
73 case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
74 SendCurrentVote(true);
75 // This will reset the timer if already running.
76 renotify_current_vote_timer_.Start(
77 FROM_HERE, kRenotifyVotePeriod,
79 &SystemMemoryPressureEvaluatorFuchsia::SendCurrentVote,
80 base::Unretained(this), true));
87 } // namespace memory_pressure