system_memory_pressure_evaluator_fuchsia.cc 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2020 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. #include "components/memory_pressure/system_memory_pressure_evaluator_fuchsia.h"
  5. #include <lib/sys/cpp/component_context.h>
  6. #include "base/fuchsia/fuchsia_logging.h"
  7. #include "base/fuchsia/process_context.h"
  8. #include "base/strings/string_piece.h"
  9. #include "base/time/time.h"
  10. #include "components/memory_pressure/memory_pressure_voter.h"
  11. namespace memory_pressure {
  12. namespace {
  13. base::MemoryPressureListener::MemoryPressureLevel
  14. FuchsiaToBaseMemoryPressureLevel(fuchsia::memorypressure::Level level) {
  15. switch (level) {
  16. case fuchsia::memorypressure::Level::NORMAL:
  17. return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
  18. case fuchsia::memorypressure::Level::WARNING:
  19. return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE;
  20. case fuchsia::memorypressure::Level::CRITICAL:
  21. return base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL;
  22. };
  23. }
  24. } // namespace
  25. const base::TimeDelta
  26. SystemMemoryPressureEvaluatorFuchsia::kRenotifyVotePeriod =
  27. base::Seconds(5);
  28. SystemMemoryPressureEvaluatorFuchsia::SystemMemoryPressureEvaluatorFuchsia(
  29. std::unique_ptr<memory_pressure::MemoryPressureVoter> voter)
  30. : memory_pressure::SystemMemoryPressureEvaluator(std::move(voter)),
  31. binding_(this) {
  32. binding_.set_error_handler(base::LogFidlErrorAndExitProcess(
  33. FROM_HERE, "fuchsia.memorypressure.Provider"));
  34. DVLOG(1) << "Registering for memory pressure updates.";
  35. auto provider = base::ComponentContextForProcess()
  36. ->svc()
  37. ->Connect<fuchsia::memorypressure::Provider>();
  38. provider->RegisterWatcher(binding_.NewBinding());
  39. }
  40. SystemMemoryPressureEvaluatorFuchsia::~SystemMemoryPressureEvaluatorFuchsia() =
  41. default;
  42. void SystemMemoryPressureEvaluatorFuchsia::OnLevelChanged(
  43. fuchsia::memorypressure::Level level,
  44. OnLevelChangedCallback callback) {
  45. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  46. VLOG(1) << "OnLevelChanged: level=" << static_cast<uint32_t>(level);
  47. base::MemoryPressureListener::MemoryPressureLevel new_level =
  48. FuchsiaToBaseMemoryPressureLevel(level);
  49. VLOG(1) << "MemoryPressureLevel: " << new_level;
  50. // Set the new vote, and determine whether to notify listeners.
  51. SetCurrentVote(new_level);
  52. switch (new_level) {
  53. case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
  54. // By convention no notifications are sent when returning to NONE level.
  55. SendCurrentVote(false);
  56. renotify_current_vote_timer_.Stop();
  57. break;
  58. case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
  59. case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
  60. SendCurrentVote(true);
  61. // This will reset the timer if already running.
  62. renotify_current_vote_timer_.Start(
  63. FROM_HERE, kRenotifyVotePeriod,
  64. base::BindRepeating(
  65. &SystemMemoryPressureEvaluatorFuchsia::SendCurrentVote,
  66. base::Unretained(this), true));
  67. break;
  68. }
  69. callback();
  70. }
  71. } // namespace memory_pressure