Index: base/chromeos/memory_pressure_observer_chromeos.cc |
diff --git a/base/chromeos/memory_pressure_observer_chromeos.cc b/base/chromeos/memory_pressure_observer_chromeos.cc |
deleted file mode 100644 |
index 5691eb8b4ed1dbd626e85ef1ea617886396eeafd..0000000000000000000000000000000000000000 |
--- a/base/chromeos/memory_pressure_observer_chromeos.cc |
+++ /dev/null |
@@ -1,211 +0,0 @@ |
-// Copyright 2014 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/chromeos/memory_pressure_observer_chromeos.h" |
- |
-#include "base/message_loop/message_loop.h" |
-#include "base/metrics/histogram_macros.h" |
-#include "base/process/process_metrics.h" |
-#include "base/time/time.h" |
- |
-namespace base { |
- |
-namespace { |
- |
-// The time between memory pressure checks. While under critical pressure, this |
-// is also the timer to repeat cleanup attempts. |
-const int kMemoryPressureIntervalMs = 1000; |
- |
-// The time which should pass between two moderate memory pressure calls. |
-const int kModerateMemoryPressureCooldownMs = 10000; |
- |
-// Number of event polls before the next moderate pressure event can be sent. |
-const int kModerateMemoryPressureCooldown = |
- kModerateMemoryPressureCooldownMs / kMemoryPressureIntervalMs; |
- |
-// Threshold constants to emit pressure events. |
-const int kNormalMemoryPressureModerateThresholdPercent = 60; |
-const int kNormalMemoryPressureCriticalThresholdPercent = 90; |
-const int kAggressiveMemoryPressureModerateThresholdPercent = 35; |
-const int kAggressiveMemoryPressureCriticalThresholdPercent = 70; |
- |
-// The possible state for memory pressure level. The values should be in line |
-// with values in MemoryPressureListener::MemoryPressureLevel and should be |
-// updated if more memory pressure levels are introduced. |
-enum MemoryPressureLevelUMA { |
- MEMORY_PRESSURE_LEVEL_NONE = 0, |
- MEMORY_PRESSURE_LEVEL_MODERATE, |
- MEMORY_PRESSURE_LEVEL_CRITICAL, |
- NUM_MEMORY_PRESSURE_LEVELS |
-}; |
- |
-// Converts a |MemoryPressureThreshold| value into a used memory percentage for |
-// the moderate pressure event. |
-int GetModerateMemoryThresholdInPercent( |
- MemoryPressureObserverChromeOS::MemoryPressureThresholds thresholds) { |
- return thresholds == MemoryPressureObserverChromeOS:: |
- THRESHOLD_AGGRESSIVE_CACHE_DISCARD || |
- thresholds == MemoryPressureObserverChromeOS::THRESHOLD_AGGRESSIVE |
- ? kAggressiveMemoryPressureModerateThresholdPercent |
- : kNormalMemoryPressureModerateThresholdPercent; |
-} |
- |
-// Converts a |MemoryPressureThreshold| value into a used memory percentage for |
-// the critical pressure event. |
-int GetCriticalMemoryThresholdInPercent( |
- MemoryPressureObserverChromeOS::MemoryPressureThresholds thresholds) { |
- return thresholds == MemoryPressureObserverChromeOS:: |
- THRESHOLD_AGGRESSIVE_TAB_DISCARD || |
- thresholds == MemoryPressureObserverChromeOS::THRESHOLD_AGGRESSIVE |
- ? kAggressiveMemoryPressureCriticalThresholdPercent |
- : kNormalMemoryPressureCriticalThresholdPercent; |
-} |
- |
-// Converts free percent of memory into a memory pressure value. |
-MemoryPressureListener::MemoryPressureLevel GetMemoryPressureLevelFromFillLevel( |
- int actual_fill_level, |
- int moderate_threshold, |
- int critical_threshold) { |
- if (actual_fill_level < moderate_threshold) |
- return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE; |
- return actual_fill_level < critical_threshold |
- ? MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE |
- : MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL; |
-} |
- |
-} // namespace |
- |
-MemoryPressureObserverChromeOS::MemoryPressureObserverChromeOS( |
- MemoryPressureThresholds thresholds) |
- : current_memory_pressure_level_( |
- MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE), |
- moderate_pressure_repeat_count_(0), |
- moderate_pressure_threshold_percent_( |
- GetModerateMemoryThresholdInPercent(thresholds)), |
- critical_pressure_threshold_percent_( |
- GetCriticalMemoryThresholdInPercent(thresholds)), |
- weak_ptr_factory_(this) { |
- StartObserving(); |
-} |
- |
-MemoryPressureObserverChromeOS::~MemoryPressureObserverChromeOS() { |
- StopObserving(); |
-} |
- |
-void MemoryPressureObserverChromeOS::ScheduleEarlyCheck() { |
- MessageLoop::current()->PostTask( |
- FROM_HERE, |
- Bind(&MemoryPressureObserverChromeOS::CheckMemoryPressure, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void MemoryPressureObserverChromeOS::StartObserving() { |
- timer_.Start(FROM_HERE, |
- TimeDelta::FromMilliseconds(kMemoryPressureIntervalMs), |
- Bind(&MemoryPressureObserverChromeOS:: |
- CheckMemoryPressureAndRecordStatistics, |
- weak_ptr_factory_.GetWeakPtr())); |
-} |
- |
-void MemoryPressureObserverChromeOS::StopObserving() { |
- // If StartObserving failed, StopObserving will still get called. |
- timer_.Stop(); |
-} |
- |
-void MemoryPressureObserverChromeOS::CheckMemoryPressureAndRecordStatistics() { |
- CheckMemoryPressure(); |
- |
- // Record UMA histogram statistics for the current memory pressure level. |
- MemoryPressureLevelUMA memory_pressure_level_uma(MEMORY_PRESSURE_LEVEL_NONE); |
- switch (current_memory_pressure_level_) { |
- case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: |
- memory_pressure_level_uma = MEMORY_PRESSURE_LEVEL_NONE; |
- break; |
- case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: |
- memory_pressure_level_uma = MEMORY_PRESSURE_LEVEL_MODERATE; |
- break; |
- case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: |
- memory_pressure_level_uma = MEMORY_PRESSURE_LEVEL_CRITICAL; |
- break; |
- } |
- |
- UMA_HISTOGRAM_ENUMERATION("ChromeOS.MemoryPressureLevel", |
- memory_pressure_level_uma, |
- NUM_MEMORY_PRESSURE_LEVELS); |
-} |
- |
-void MemoryPressureObserverChromeOS::CheckMemoryPressure() { |
- MemoryPressureListener::MemoryPressureLevel old_pressure = |
- current_memory_pressure_level_; |
- current_memory_pressure_level_ = |
- GetMemoryPressureLevelFromFillLevel(GetUsedMemoryInPercent(), |
- moderate_pressure_threshold_percent_, |
- critical_pressure_threshold_percent_); |
- // In case there is no memory pressure we do not notify. |
- if (current_memory_pressure_level_ == |
- MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) { |
- return; |
- } |
- if (old_pressure == current_memory_pressure_level_) { |
- // If the memory pressure is still at the same level, we notify again for a |
- // critical level. In case of a moderate level repeat however, we only send |
- // a notification after a certain time has passed. |
- if (current_memory_pressure_level_ == |
- MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE && |
- ++moderate_pressure_repeat_count_ < |
- kModerateMemoryPressureCooldown) { |
- return; |
- } |
- } else if (current_memory_pressure_level_ == |
- MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE && |
- old_pressure == |
- MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) { |
- // When we reducing the pressure level from critical to moderate, we |
- // restart the timeout and do not send another notification. |
- moderate_pressure_repeat_count_ = 0; |
- return; |
- } |
- moderate_pressure_repeat_count_ = 0; |
- MemoryPressureListener::NotifyMemoryPressure(current_memory_pressure_level_); |
-} |
- |
-// Gets the used ChromeOS memory in percent. |
-int MemoryPressureObserverChromeOS::GetUsedMemoryInPercent() { |
- base::SystemMemoryInfoKB info; |
- if (!base::GetSystemMemoryInfo(&info)) { |
- VLOG(1) << "Cannot determine the free memory of the system."; |
- return 0; |
- } |
- // TODO(skuhne): Instead of adding the kernel memory pressure calculation |
- // logic here, we should have a kernel mechanism similar to the low memory |
- // notifier in ChromeOS which offers multiple pressure states. |
- // To track this, we have crbug.com/381196. |
- |
- // The available memory consists of "real" and virtual (z)ram memory. |
- // Since swappable memory uses a non pre-deterministic compression and |
- // the compression creates its own "dynamic" in the system, it gets |
- // de-emphasized by the |kSwapWeight| factor. |
- const int kSwapWeight = 4; |
- |
- // The total memory we have is the "real memory" plus the virtual (z)ram. |
- int total_memory = info.total + info.swap_total / kSwapWeight; |
- |
- // The kernel internally uses 50MB. |
- const int kMinFileMemory = 50 * 1024; |
- |
- // Most file memory can be easily reclaimed. |
- int file_memory = info.active_file + info.inactive_file; |
- // unless it is dirty or it's a minimal portion which is required. |
- file_memory -= info.dirty + kMinFileMemory; |
- |
- // Available memory is the sum of free, swap and easy reclaimable memory. |
- int available_memory = |
- info.free + info.swap_free / kSwapWeight + file_memory; |
- |
- DCHECK(available_memory < total_memory); |
- int percentage = ((total_memory - available_memory) * 100) / total_memory; |
- return percentage; |
-} |
- |
-} // namespace base |