|  | // 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 |