| Index: base/trace_event/memory_peak_detector.h | 
| diff --git a/base/trace_event/memory_peak_detector.h b/base/trace_event/memory_peak_detector.h | 
| index b91429583322549619e7f91da7eb45af953696aa..d2da9ca0c9985b028f00f6e429dcf545d63757ba 100644 | 
| --- a/base/trace_event/memory_peak_detector.h | 
| +++ b/base/trace_event/memory_peak_detector.h | 
| @@ -23,6 +23,13 @@ namespace trace_event { | 
|  | 
| struct MemoryDumpProviderInfo; | 
|  | 
| +// Detects temporally local memory peaks. Peak detection is based on | 
| +// continuously querying memory usage using MemoryDumpprovider(s) that support | 
| +// fast polling (e.g., ProcessMetricsDumpProvider which under the hoods reads | 
| +// /proc/PID/statm on Linux) and using a cobination of: | 
| +// - An static threshold (currently 1% of total system memory). | 
| +// - Sliding window stddev analysis. | 
| +// Design doc: https://goo.gl/0kOU4A . | 
| // This class is NOT thread-safe, the caller has to ensure linearization of | 
| // the calls to the public methods. In any case, the public methods do NOT have | 
| // to be called from the |task_runner| on which the polling tasks run. | 
| @@ -39,6 +46,21 @@ class BASE_EXPORT MemoryPeakDetector { | 
| RUNNING  // After Start(). The PollMemoryAndDetectPeak() task is scheduled. | 
| }; | 
|  | 
| +  // Peak detector configuration, passed to Start(). | 
| +  struct Config { | 
| +    // The rate at which memory will be polled. Polls will happen on the task | 
| +    // runner passed to Setup(). | 
| +    uint32_t polling_interval_ms; | 
| + | 
| +    // Two consecutive peak detection callbacks will happen at least | 
| +    // |min_time_between_peaks_ms| apart from each other. | 
| +    uint32_t min_time_between_peaks_ms; | 
| + | 
| +    // When enabled causes a TRACE_COUNTER event to be injected in the trace | 
| +    // for each poll (if tracing is enabled). | 
| +    bool enable_verbose_poll_tracing; | 
| +  }; | 
| + | 
| static MemoryPeakDetector* GetInstance(); | 
|  | 
| // Configures the peak detector, binding the polling tasks on the given | 
| @@ -66,7 +88,7 @@ class BASE_EXPORT MemoryPeakDetector { | 
| // If not, the detector remains in the ENABLED state and will start polling | 
| // automatically (i.e. without requiring another call to Start()) on the | 
| // next call to NotifyMemoryDumpProvidersChanged(). | 
| -  void Start(); | 
| +  void Start(Config); | 
|  | 
| // Stops the polling on the task runner (if was active at all). This doesn't | 
| // wait for the task runner to drain pending tasks, so it is possible that | 
| @@ -75,24 +97,34 @@ class BASE_EXPORT MemoryPeakDetector { | 
| // with the task runner. | 
| void Stop(); | 
|  | 
| +  // If Start()-ed, prevents that a peak callback is triggered before the next | 
| +  // |min_time_between_peaks_ms|. No-op if the peak detector is not enabled. | 
| +  void Throttle(); | 
| + | 
| // Used by MemoryDumpManager to notify that the list of polling-capable dump | 
| // providers has changed. The peak detector will reload the list on the next | 
| // polling task. This function can be called before Setup(), in which | 
| // case will be just a no-op. | 
| void NotifyMemoryDumpProvidersChanged(); | 
|  | 
| +  void SetStaticThresholdForTesting(uint64_t static_threshold_bytes); | 
| + | 
| private: | 
| friend class MemoryPeakDetectorTest; | 
|  | 
| +  static constexpr uint32_t kSlidingWindowNumSamples = 50; | 
| + | 
| MemoryPeakDetector(); | 
| ~MemoryPeakDetector(); | 
|  | 
| // All these methods are always called on the |task_runner_|. | 
| -  void StartInternal(); | 
| +  void StartInternal(Config); | 
| void StopInternal(); | 
| void TearDownInternal(); | 
| void ReloadDumpProvidersAndStartPollingIfNeeded(); | 
| void PollMemoryAndDetectPeak(uint32_t expected_generation); | 
| +  bool DetectPeakUsingSlidingWindowStddev(uint64_t last_sample_bytes); | 
| +  void ResetPollHistory(bool keep_last_sample = false); | 
|  | 
| // It is safe to call these testing methods only on the |task_runner_|. | 
| State state_for_testing() const { return state_; } | 
| @@ -127,7 +159,15 @@ class BASE_EXPORT MemoryPeakDetector { | 
| uint32_t generation_; | 
|  | 
| State state_; | 
| -  uint32_t polling_interval_ms_; | 
| + | 
| +  // Config passed to Start(), only valid when |state_| = {ENABLED, RUNNING}. | 
| +  Config config_; | 
| + | 
| +  uint64_t static_threshold_bytes_; | 
| +  uint32_t skip_polls_; | 
| +  uint64_t last_dump_memory_total_; | 
| +  uint64_t samples_bytes_[kSlidingWindowNumSamples]; | 
| +  uint32_t samples_index_; | 
| uint32_t poll_tasks_count_for_testing_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(MemoryPeakDetector); | 
|  |