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