| Index: components/memory_pressure/memory_pressure_monitor.h
|
| diff --git a/components/memory_pressure/memory_pressure_monitor.h b/components/memory_pressure/memory_pressure_monitor.h
|
| deleted file mode 100644
|
| index 68ad09cc0ee7e5a2c7ba5f7591384edb9892cc4e..0000000000000000000000000000000000000000
|
| --- a/components/memory_pressure/memory_pressure_monitor.h
|
| +++ /dev/null
|
| @@ -1,210 +0,0 @@
|
| -// Copyright 2016 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.
|
| -//
|
| -// Declares the MemoryPressureMonitor class. This is responsible for monitoring
|
| -// system-wide memory pressure and dispatching memory pressure signals to
|
| -// MemoryPressureListener. It is also responsible for rate limiting calls to the
|
| -// memory pressure subsytem and gathering statistics for UMA.
|
| -//
|
| -// The class has a few compile time differences depending on if
|
| -// MEMORY_PRESSURE_IS_POLLING is defined. For Windows, ChromeOS and Linux
|
| -// the implementation is polling so MEMORY_PRESSURE_IS_POLLING is defined. For
|
| -// Mac, iOS and Android it is not defined.
|
| -//
|
| -// The difference is that "polling" platforms have no native OS signals
|
| -// indicating memory pressure. These platforms implement
|
| -// DirectMemoryPressureCalculator, which is polled on a schedule to check for
|
| -// memory pressure changes. On non-polling platforms the OS provides a native
|
| -// signal. This signal is observed by the platform-specific implementation of
|
| -// MemoryPressureMonitorImpl.
|
| -//
|
| -// The memory pressure system periodically repeats memory pressure signals while
|
| -// under memory pressure (the interval varying depending on the pressure level).
|
| -// As such, even non-polling platforms require a scheduling mechanism for
|
| -// repeating notifications. Both implementations share this basic scheduling
|
| -// subsystem, and also leverage it to make timely UMA reports.
|
| -
|
| -#ifndef COMPONENTS_MEMORY_PRESSURE_MEMORY_PRESSURE_MONITOR_H_
|
| -#define COMPONENTS_MEMORY_PRESSURE_MEMORY_PRESSURE_MONITOR_H_
|
| -
|
| -#include <map>
|
| -#include <memory>
|
| -
|
| -#include "base/callback.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/synchronization/lock.h"
|
| -#include "base/time/time.h"
|
| -#include "components/memory_pressure/memory_pressure_listener.h"
|
| -
|
| -namespace base {
|
| -class TaskRunner;
|
| -class TickClock;
|
| -} // namespace
|
| -
|
| -namespace memory_pressure {
|
| -
|
| -class MemoryPressureCalculator;
|
| -class MemoryPressureStatsCollector;
|
| -
|
| -#if !defined(MEMORY_PRESSURE_IS_POLLING)
|
| -// For non-polling platform specific implementation details. An instance of
|
| -// this class will be encapsulated in the monitor. It will received an injected
|
| -// callback that routes messages to OnMemoryPressureChanged.
|
| -class MemoryPressureMonitorImpl;
|
| -#endif
|
| -
|
| -// A thread-safe class for directly querying and automatically monitoring
|
| -// memory pressure. When system memory pressure levels change this class is
|
| -// responsible for notifying MemoryPressureListeners, and periodically
|
| -// renotifying them as conditions persist. This class will do its periodic work
|
| -// on the thread on which it was created. However, it is safe to call
|
| -// GetCurrentPressureLevel from any thread.
|
| -//
|
| -// This class doesn't make use of base::RepeatingTimer as it leaves an orphaned
|
| -// scheduled task every time it is canceled. This can occur every time a memory
|
| -// pressure level transition occurs, which has no strict upper bound. Instead
|
| -// a collection of at most "number of memory pressure level" scheduled tasks
|
| -// is used, with these tasks being reused as transition levels are crossed and
|
| -// polling requirements change. See |scheduled_checks_| and
|
| -// "ScheduleTaskIfNeededLocked" for details.
|
| -class MemoryPressureMonitor {
|
| - public:
|
| - using MemoryPressureLevel = MemoryPressureListener::MemoryPressureLevel;
|
| -
|
| - // A simple dispatch delegate as a testing seam. Makes unittests much simpler
|
| - // as they don't need to setup a multithreaded environment.
|
| - using DispatchCallback = base::Callback<void(MemoryPressureLevel)>;
|
| -
|
| -#if defined(MEMORY_PRESSURE_IS_POLLING)
|
| - // The minimum time that must pass between successive polls. This enforces an
|
| - // upper bound on the rate of calls to the contained MemoryPressureCalculator.
|
| - // 100ms (10Hz) allows a relatively fast respsonse time for rapidly increasing
|
| - // memory usage, but limits the amount of work done in the calculator and
|
| - // stats collection.
|
| - enum : int { kMinimumTimeBetweenSamplesMs = 100 };
|
| - // On polling platforms this is required to be somewhat short in order to
|
| - // observe memory pressure changes as they occur.
|
| - enum : int { kDefaultPollingIntervalMs = 5000 };
|
| -#else
|
| - // On non-polling platforms this is only required for keeping statistics up to
|
| - // date so can be quite a long period.
|
| - enum : int { kDefaultPollingIntervalMs = 60000 };
|
| -#endif
|
| -
|
| - // Renotification intervals, per pressure level. These are the same on all
|
| - // platforms. These act as an upper bound on the polling interval when under
|
| - // the corresponding memory pressure.
|
| - enum : int { kNotificationIntervalPressureModerateMs = 5000 };
|
| - enum : int { kNotificationIntervalPressureCriticalMs = 1000 };
|
| -
|
| -#if defined(MEMORY_PRESSURE_IS_POLLING)
|
| - // Fully configurable constructor for polling platforms.
|
| - MemoryPressureMonitor(const scoped_refptr<base::TaskRunner>& task_runner,
|
| - base::TickClock* tick_clock,
|
| - MemoryPressureStatsCollector* stats_collector,
|
| - MemoryPressureCalculator* calculator,
|
| - const DispatchCallback& dispatch_callback);
|
| -#else
|
| - // Constructor for non-polling platforms.
|
| - MemoryPressureMonitor(const scoped_refptr<base::TaskRunner>& task_runner,
|
| - base::TickClock* tick_clock,
|
| - MemoryPressureStatsCollector* stats_collector,
|
| - const DispatchCallback& dispatch_callback,
|
| - MemoryPressureLevel initial_pressure_level);
|
| -#endif
|
| -
|
| - ~MemoryPressureMonitor();
|
| -
|
| - // Returns the current memory pressure level. On polling platforms this may
|
| - // result in a forced calculation of the current pressure level (a cheap
|
| - // operation). Can be called from any thread.
|
| - MemoryPressureLevel GetCurrentPressureLevel();
|
| -
|
| - // Schedules a memory pressure check to run soon. This can be called from any
|
| - // thread.
|
| - void CheckMemoryPressureSoon();
|
| -
|
| - private:
|
| - // For unittesting.
|
| - friend class TestMemoryPressureMonitor;
|
| -
|
| -#if !defined(MEMORY_PRESSURE_IS_POLLING)
|
| - // Notifications from the OS will be routed here by the contained
|
| - // MemoryPressureMonitorImpl instance. For statistics and renotification to
|
| - // work properly this must be notified of all pressure level changes, even
|
| - // those indicating a return to a state of no pressure.
|
| - void OnMemoryPressureChanged(MemoryPressureLevel level);
|
| -#endif
|
| -
|
| - // Starts the memory pressure monitor. To be called in the constructor.
|
| - void Start();
|
| -
|
| - // Checks memory pressure and updates stats. This is the entry point for all
|
| - // scheduled checks. Each scheduled check is assigned a |serial| id
|
| - // (monotonically increasing) which is used to tie the task to the time at
|
| - // which it was scheduled via the |scheduled_checks_| map.
|
| - void CheckPressureAndUpdateStats(int serial);
|
| - void CheckPressureAndUpdateStatsLocked(int serial);
|
| -
|
| - // Ensures that a task is scheduled for renotification/recalculation/stats
|
| - // updating. Uses the |serial| id of the current task to determine the time at
|
| - // which the next scheduled check should run. Assumes |lock_| is held.
|
| - void ScheduleTaskIfNeededLocked(int serial);
|
| -
|
| - // Schedules a task.
|
| - void ScheduleTaskLocked(base::TimeTicks when);
|
| -
|
| - // A lock for synchronization.
|
| - base::Lock lock_;
|
| -
|
| - // Injected dependencies.
|
| - // The task runner on which periodic pressure checks and statistics uploading
|
| - // are run.
|
| - scoped_refptr<base::TaskRunner> task_runner_;
|
| - // The tick clock in use. Used under |lock_|.
|
| - base::TickClock* tick_clock_;
|
| - // The stats collector in use. Used under |lock_|.
|
| - MemoryPressureStatsCollector* stats_collector_;
|
| - // The memory pressure calculator in use. Used under |lock_|.
|
| - MemoryPressureCalculator* calculator_;
|
| - // The dispatch callback to use.
|
| - DispatchCallback dispatch_callback_;
|
| -
|
| -#if !defined(MEMORY_PRESSURE_IS_POLLING)
|
| - // On non-polling platforms this object is responsible for routing OS
|
| - // notifications to OnMemoryPressureChanged, and setting the initial pressure
|
| - // value. The OS specific implementation is responsible for allocating this
|
| - // object.
|
| - std::unique_ptr<MemoryPressureMonitorImpl> monitor_impl_;
|
| -#endif
|
| -
|
| - // Object state.
|
| - // The pressure level as of the most recent poll or notification. Under
|
| - // |lock_|.
|
| - MemoryPressureLevel current_memory_pressure_level_;
|
| -#if defined(MEMORY_PRESSURE_IS_POLLING)
|
| - // Time of the last pressure check. Under |lock_|. Only needed for polling
|
| - // implementations.
|
| - base::TimeTicks last_check_;
|
| -#endif
|
| - // Time of the last pressure notification. Under |lock_|.
|
| - base::TimeTicks last_notification_;
|
| - // A map of scheduled pressure checks/statistics updates and their serial
|
| - // numbers. Under |lock_|.
|
| - std::map<int, base::TimeTicks> scheduled_checks_;
|
| - // The most recently assigned serial number for a pressure check. The number
|
| - // 0 will never be assigned but will instead be reserved for unscheduled
|
| - // checks initiated externally. Under |lock_|.
|
| - int serial_number_;
|
| -
|
| - // Weak pointer factory to ourself used for posting delayed tasks to
|
| - // task_runner_.
|
| - base::WeakPtrFactory<MemoryPressureMonitor> weak_ptr_factory_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitor);
|
| -};
|
| -
|
| -} // namespace memory_pressure
|
| -
|
| -#endif // COMPONENTS_MEMORY_PRESSURE_MEMORY_PRESSURE_MONITOR_H_
|
|
|