| Index: base/win/memory_pressure_monitor.h
|
| diff --git a/base/win/memory_pressure_monitor.h b/base/win/memory_pressure_monitor.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..933d91290f113befc56f607641b7d7f60495d690
|
| --- /dev/null
|
| +++ b/base/win/memory_pressure_monitor.h
|
| @@ -0,0 +1,144 @@
|
| +// Copyright 2015 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 BASE_WIN_MEMORY_PRESSURE_MONITOR_H_
|
| +#define BASE_WIN_MEMORY_PRESSURE_MONITOR_H_
|
| +
|
| +#include "base/base_export.h"
|
| +#include "base/memory/memory_pressure_listener.h"
|
| +#include "base/memory/memory_pressure_monitor.h"
|
| +#include "base/memory/weak_ptr.h"
|
| +#include "base/threading/thread_checker.h"
|
| +#include "base/timer/timer.h"
|
| +
|
| +// To not pull in windows.h.
|
| +typedef struct _MEMORYSTATUSEX MEMORYSTATUSEX;
|
| +
|
| +namespace base {
|
| +namespace win {
|
| +
|
| +// Windows memory pressure monitor. Because there is no OS provided signal this
|
| +// polls at a low frequency (once per second), and applies internal hysteresis.
|
| +class BASE_EXPORT MemoryPressureMonitor : public base::MemoryPressureMonitor {
|
| + public:
|
| + // Constants governing the polling and hysteresis behaviour of the observer.
|
| +
|
| + // The polling interval, in milliseconds. While under critical pressure, this
|
| + // is also the timer to repeat cleanup attempts.
|
| + static const int kPollingIntervalMs;
|
| + // The time which should pass between 2 successive moderate memory pressure
|
| + // signals, in milliseconds.
|
| + static const int kModeratePressureCooldownMs;
|
| + // The number of cycles that should pass between 2 successive moderate memory
|
| + // pressure signals.
|
| + static const int kModeratePressureCooldownCycles;
|
| +
|
| + // Constants governing the memory pressure level detection.
|
| +
|
| + // The amount of total system memory beyond which a system is considered to be
|
| + // a large-memory system.
|
| + static const int kLargeMemoryThresholdMb;
|
| + // Default minimum free memory thresholds for small-memory systems, in MB.
|
| + static const int kSmallMemoryDefaultModerateThresholdMb;
|
| + static const int kSmallMemoryDefaultCriticalThresholdMb;
|
| + // Default minimum free memory thresholds for large-memory systems, in MB.
|
| + static const int kLargeMemoryDefaultModerateThresholdMb;
|
| + static const int kLargeMemoryDefaultCriticalThresholdMb;
|
| +
|
| + // Default constructor. Will choose thresholds automatically basd on the
|
| + // actual amount of system memory.
|
| + MemoryPressureMonitor();
|
| +
|
| + // Constructor with explicit memory thresholds. These represent the amount of
|
| + // free memory below which the applicable memory pressure state engages.
|
| + MemoryPressureMonitor(int moderate_threshold_mb, int critical_threshold_mb);
|
| +
|
| + ~MemoryPressureMonitor() override;
|
| +
|
| + // Schedules a memory pressure check to run soon. This must be called on the
|
| + // same thread where the monitor was instantiated.
|
| + void CheckMemoryPressureSoon();
|
| +
|
| + // Get the current memory pressure level. This can be called from any thread.
|
| + MemoryPressureLevel GetCurrentPressureLevel() const override;
|
| +
|
| + // Returns the moderate pressure level free memory threshold, in MB.
|
| + int moderate_threshold_mb() const { return moderate_threshold_mb_; }
|
| +
|
| + // Returns the critical pressure level free memory threshold, in MB.
|
| + int critical_threshold_mb() const { return critical_threshold_mb_; }
|
| +
|
| + protected:
|
| + // Internals are exposed for unittests.
|
| +
|
| + // Automatically infers threshold values based on system memory. This invokes
|
| + // GetMemoryStatus so it can be mocked in unittests.
|
| + void InferThresholds();
|
| +
|
| + // Starts observing the memory fill level. Calls to StartObserving should
|
| + // always be matched with calls to StopObserving.
|
| + void StartObserving();
|
| +
|
| + // Stop observing the memory fill level. May be safely called if
|
| + // StartObserving has not been called. Must be called from the same thread on
|
| + // which the monitor was instantiated.
|
| + void StopObserving();
|
| +
|
| + // Checks memory pressure, storing the current level, applying any hysteresis
|
| + // and emitting memory pressure level change signals as necessary. This
|
| + // function is called periodically while the monitor is observing memory
|
| + // pressure. This is split out from CheckMemoryPressureAndRecordStatistics so
|
| + // that it may be called by CheckMemoryPressureSoon and not invoke UMA
|
| + // logging. Must be called from the same thread on which the monitor was
|
| + // instantiated.
|
| + void CheckMemoryPressure();
|
| +
|
| + // Wrapper to CheckMemoryPressure that also records the observed memory
|
| + // pressure level via an UMA enumeration. This is the function that is called
|
| + // periodically by the timer. Must be called from the same thread on which the
|
| + // monitor was instantiated.
|
| + void CheckMemoryPressureAndRecordStatistics();
|
| +
|
| + // Calculates the current instantaneous memory pressure level. This does not
|
| + // use any hysteresis and simply returns the result at the current moment. Can
|
| + // be called on any thread.
|
| + MemoryPressureLevel CalculateCurrentPressureLevel();
|
| +
|
| + // Gets system memory status. This is virtual as a unittesting hook. Returns
|
| + // true if the system call succeeds, false otherwise. Can be called on any
|
| + // thread.
|
| + virtual bool GetSystemMemoryStatus(MEMORYSTATUSEX* mem_status);
|
| +
|
| + private:
|
| + // Threshold amounts of available memory that trigger pressure levels. See
|
| + // memory_pressure_monitor.cc for a discussion of reasonable values for these.
|
| + int moderate_threshold_mb_;
|
| + int critical_threshold_mb_;
|
| +
|
| + // A periodic timer to check for memory pressure changes.
|
| + base::RepeatingTimer<MemoryPressureMonitor> timer_;
|
| +
|
| + // The current memory pressure.
|
| + MemoryPressureLevel current_memory_pressure_level_;
|
| +
|
| + // To slow down the amount of moderate pressure event calls, this gets used to
|
| + // count the number of events since the last event occured. This is used by
|
| + // |CheckMemoryPressure| to apply hysteresis on the raw results of
|
| + // |CalculateCurrentPressureLevel|.
|
| + int moderate_pressure_repeat_count_;
|
| +
|
| + // Ensures that this object is used from a single thread.
|
| + base::ThreadChecker thread_checker_;
|
| +
|
| + // Weak pointer factory to ourself used for scheduling calls to
|
| + // CheckMemoryPressure/CheckMemoryPressureAndRecordStatistics via |timer_|.
|
| + base::WeakPtrFactory<MemoryPressureMonitor> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitor);
|
| +};
|
| +
|
| +} // namespace win
|
| +} // namespace base
|
| +
|
| +#endif // BASE_WIN_MEMORY_PRESSURE_MONITOR_H_
|
|
|