| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef THIRD_PARTY_BLINK_RENDERER_CONTROLLER_USER_LEVEL_MEMORY_PRESSURE_SIGNAL_GENERATOR_H_ |
| #define THIRD_PARTY_BLINK_RENDERER_CONTROLLER_USER_LEVEL_MEMORY_PRESSURE_SIGNAL_GENERATOR_H_ |
| |
| #include "third_party/blink/renderer/controller/controller_export.h" |
| #include "third_party/blink/renderer/controller/memory_usage_monitor.h" |
| #include "third_party/blink/renderer/platform/scheduler/public/rail_mode_observer.h" |
| #include "third_party/blink/renderer/platform/timer.h" |
| #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" |
| |
| namespace base { |
| class TickClock; |
| } |
| |
| namespace blink { |
| |
| namespace user_level_memory_pressure_signal_generator_test { |
| class MockUserLevelMemoryPressureSignalGenerator; |
| } // namespace user_level_memory_pressure_signal_generator_test |
| |
| // Generates extra memory pressure signals (on top of the OS generated ones) |
| // when the memory usage goes over a threshold. |
| class CONTROLLER_EXPORT UserLevelMemoryPressureSignalGenerator |
| : public RAILModeObserver, |
| public MemoryUsageMonitor::Observer { |
| USING_FAST_MALLOC(UserLevelMemoryPressureSignalGenerator); |
| |
| public: |
| // Returns the shared instance. |
| static UserLevelMemoryPressureSignalGenerator& Instance(); |
| static bool Enabled(); |
| |
| UserLevelMemoryPressureSignalGenerator(); |
| ~UserLevelMemoryPressureSignalGenerator() override; |
| |
| // The caller is the owner of the |clock|. The |clock| must outlive the |
| // UserLevelMemoryPressureSignalGenerator. |
| void SetTickClockForTesting(const base::TickClock* clock); |
| |
| private: |
| friend class user_level_memory_pressure_signal_generator_test:: |
| MockUserLevelMemoryPressureSignalGenerator; |
| |
| // This is only virtual to override in tests. |
| virtual void Generate(MemoryUsage); |
| |
| // Called by delayed_report_timer_ to report metrics. |
| void OnTimerFired(TimerBase*); |
| |
| // RAILModeObserver: |
| void OnRAILModeChanged(RAILMode rail_mode) override; |
| |
| // MemoryUsageMonitor::Observer: |
| void OnMemoryPing(MemoryUsage) override; |
| |
| bool is_loading_ = false; |
| base::TimeTicks last_generated_; |
| double memory_threshold_mb_; |
| base::TimeDelta minimum_interval_; |
| TaskRunnerTimer<UserLevelMemoryPressureSignalGenerator> delayed_report_timer_; |
| const base::TickClock* clock_; |
| }; |
| |
| } // namespace blink |
| |
| #endif // THIRD_PARTY_BLINK_RENDERER_CONTROLLER_USER_LEVEL_MEMORY_PRESSURE_SIGNAL_GENERATOR_H_ |