Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2464)

Unified Diff: base/chromeos/memory_pressure_observer_chromeos.cc

Issue 815183002: Using the new MemoryPressureListener instead of the LowMemoryObserver when the enhanced memory mana… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
index 22291da09ba9191054f26eb3c8bce70470917389..4abb963b18eb5ee18950808c7a9d498aba950051 100644
--- a/base/chromeos/memory_pressure_observer_chromeos.cc
+++ b/base/chromeos/memory_pressure_observer_chromeos.cc
@@ -4,6 +4,7 @@
#include "base/chromeos/memory_pressure_observer_chromeos.h"
+#include "base/message_loop/message_loop.h"
#include "base/process/process_metrics.h"
#include "base/time/time.h"
@@ -11,15 +12,25 @@ namespace base {
namespace {
-// The time between memory pressure checks.
+// The time between memory pressure checks. While under critical pressure, this
+// is also the timer to repeat cleanup attempts.
const int kMemoryPressureIntervalInMS = 1000;
+// The cool down amount of events which should get skipped between moderate
+// pressure events. It is expressed in milliseconds divided by the timer
+// resolution.
+const int kModerateMemoryPressureCooldown = 10000 / kMemoryPressureIntervalInMS;
James Cook 2014/12/19 19:38:07 nit: I would use two constants here, like "kModera
Mr4D (OOO till 08-26) 2014/12/19 23:34:41 Done.
+
+// Threshold constants to emit pressure events.
+const int kMemoryPressureModerateThresholdPercent = 70;
+const int kMemoryPressureCriticalThresholdPercent = 90;
+
// Converts free percent of memory into a memory pressure value.
MemoryPressureListener::MemoryPressureLevel GetMemoryPressureLevelFromFillLevel(
int memory_fill_level) {
- if (memory_fill_level < 70)
+ if (memory_fill_level < kMemoryPressureModerateThresholdPercent)
return MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE;
- return memory_fill_level < 90 ?
+ return memory_fill_level < kMemoryPressureCriticalThresholdPercent ?
MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE :
MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL;
}
@@ -66,7 +77,8 @@ int GetUsedMemoryInPercent() {
MemoryPressureObserverChromeOS::MemoryPressureObserverChromeOS()
: current_memory_pressure_level_(
- MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE) {
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE),
+ moderate_pressure_repeat_counter_(0) {
StartObserving();
}
@@ -74,11 +86,18 @@ MemoryPressureObserverChromeOS::~MemoryPressureObserverChromeOS() {
StopObserving();
}
+void MemoryPressureObserverChromeOS::ScheduleEarlyCheck() {
+ MessageLoop::current()->PostTask(
+ FROM_HERE,
+ Bind(&MemoryPressureObserverChromeOS::CheckMemoryPressure,
+ base::Unretained(this)));
James Cook 2014/12/19 19:38:07 Just to double-check: |this| always outlives the M
Mr4D (OOO till 08-26) 2014/12/19 23:34:41 Originally it is/was not, but since this is in bas
+}
+
void MemoryPressureObserverChromeOS::StartObserving() {
timer_.Start(FROM_HERE,
- base::TimeDelta::FromMilliseconds(kMemoryPressureIntervalInMS),
- base::Bind(&MemoryPressureObserverChromeOS::CheckMemoryPressure,
- base::Unretained(this)));
+ TimeDelta::FromMilliseconds(kMemoryPressureIntervalInMS),
+ Bind(&MemoryPressureObserverChromeOS::CheckMemoryPressure,
+ Unretained(this)));
}
void MemoryPressureObserverChromeOS::StopObserving() {
@@ -89,13 +108,31 @@ void MemoryPressureObserverChromeOS::StopObserving() {
void MemoryPressureObserverChromeOS::CheckMemoryPressure() {
MemoryPressureListener::MemoryPressureLevel old_pressure =
current_memory_pressure_level_;
- MemoryPressureListener::MemoryPressureLevel new_pressure =
+ current_memory_pressure_level_ =
GetMemoryPressureLevelFromFillLevel(GetUsedMemoryInPercent());
- if (old_pressure != new_pressure) {
- current_memory_pressure_level_ = new_pressure;
- // Everything but NONE will be sent to the listener.
- if (new_pressure != MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE)
- MemoryPressureListener::NotifyMemoryPressure(new_pressure);
+ switch (current_memory_pressure_level_) {
James Cook 2014/12/19 19:38:07 I find the logic here hard to understand. Maybe th
Mr4D (OOO till 08-26) 2014/12/19 23:34:41 Okay, Done. Note: The reason why I chose this how
+ case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
+ // Moderate pressure changes are less frequently posted.
+ if (current_memory_pressure_level_ == old_pressure &&
+ ++moderate_pressure_repeat_counter_ <
+ kModerateMemoryPressureCooldown) {
+ return;
+ }
+ moderate_pressure_repeat_counter_ = 0;
+ // If we have just resolved the critical memory pressure, we ignore this
+ // call.
+ if (old_pressure ==
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL)
+ return;
+ // Fallthrough.
+ case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
+ // We notify the system with every check that we are (still) under
+ // pressure.
+ MemoryPressureListener::NotifyMemoryPressure(
+ current_memory_pressure_level_);
+ // Fallthrough.
+ case MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
+ break;
}
}
James Cook 2014/12/19 19:38:07 I think this function is complex enough that it ne
Mr4D (OOO till 08-26) 2014/12/20 00:12:45 Done.

Powered by Google App Engine
This is Rietveld 408576698