| // 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. |
| |
| #include "base/memory/memory_pressure_monitor.h" |
| |
| #include "base/logging.h" |
| #include "base/metrics/histogram_macros.h" |
| |
| namespace base { |
| namespace { |
| |
| MemoryPressureMonitor* g_monitor = nullptr; |
| |
| // Enumeration of UMA memory pressure levels. This needs to be kept in sync with |
| // histograms.xml and the memory pressure levels defined in |
| // MemoryPressureListener. |
| enum MemoryPressureLevelUMA { |
| UMA_MEMORY_PRESSURE_LEVEL_NONE = 0, |
| UMA_MEMORY_PRESSURE_LEVEL_MODERATE = 1, |
| UMA_MEMORY_PRESSURE_LEVEL_CRITICAL = 2, |
| // This must be the last value in the enum. |
| UMA_MEMORY_PRESSURE_LEVEL_COUNT, |
| }; |
| |
| // Converts a memory pressure level to an UMA enumeration value. |
| MemoryPressureLevelUMA MemoryPressureLevelToUmaEnumValue( |
| base::MemoryPressureListener::MemoryPressureLevel level) { |
| switch (level) { |
| case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: |
| return UMA_MEMORY_PRESSURE_LEVEL_NONE; |
| case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: |
| return UMA_MEMORY_PRESSURE_LEVEL_MODERATE; |
| case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: |
| return UMA_MEMORY_PRESSURE_LEVEL_CRITICAL; |
| } |
| NOTREACHED(); |
| return UMA_MEMORY_PRESSURE_LEVEL_NONE; |
| } |
| |
| } // namespace |
| |
| MemoryPressureMonitor::MemoryPressureMonitor() { |
| DCHECK(!g_monitor); |
| g_monitor = this; |
| } |
| |
| MemoryPressureMonitor::~MemoryPressureMonitor() { |
| DCHECK(g_monitor); |
| g_monitor = nullptr; |
| } |
| |
| // static |
| MemoryPressureMonitor* MemoryPressureMonitor::Get() { |
| return g_monitor; |
| } |
| void MemoryPressureMonitor::RecordMemoryPressure( |
| base::MemoryPressureListener::MemoryPressureLevel level, |
| int ticks) { |
| // Use the more primitive STATIC_HISTOGRAM_POINTER_BLOCK macro because the |
| // simple UMA_HISTOGRAM macros don't expose 'AddCount' functionality. |
| STATIC_HISTOGRAM_POINTER_BLOCK( |
| "Memory.PressureLevel", |
| AddCount(MemoryPressureLevelToUmaEnumValue(level), ticks), |
| base::LinearHistogram::FactoryGet( |
| "Memory.PressureLevel", 1, UMA_MEMORY_PRESSURE_LEVEL_COUNT, |
| UMA_MEMORY_PRESSURE_LEVEL_COUNT + 1, |
| base::HistogramBase::kUmaTargetedHistogramFlag)); |
| } |
| |
| } // namespace base |