diff options
Diffstat (limited to 'base/memory/memory_pressure_monitor.cc')
-rw-r--r-- | base/memory/memory_pressure_monitor.cc | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/base/memory/memory_pressure_monitor.cc b/base/memory/memory_pressure_monitor.cc new file mode 100644 index 0000000000..ed350b81b9 --- /dev/null +++ b/base/memory/memory_pressure_monitor.cc @@ -0,0 +1,71 @@ +// 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 |