Index: content/browser/memory/memory_condition_observer.cc |
diff --git a/content/browser/memory/memory_condition_observer.cc b/content/browser/memory/memory_condition_observer.cc |
index d429f077ab6f37644bb1854f29a9ad84a7d5bc74..026438c0e976bd26e5c92ae943646a9efc10fa42 100644 |
--- a/content/browser/memory/memory_condition_observer.cc |
+++ b/content/browser/memory/memory_condition_observer.cc |
@@ -62,37 +62,37 @@ void SetSecondsVariationParameter( |
MemoryConditionObserver::MemoryConditionObserver( |
MemoryCoordinatorImpl* coordinator, |
scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
- : coordinator_(coordinator), task_runner_(task_runner) { |
+ : coordinator_(coordinator), |
+ task_runner_(task_runner), |
+ current_available_(0) { |
DCHECK(coordinator_); |
InitializeParameters(); |
DCHECK(ValidateParameters()); |
+ update_condition_closure_.Reset(base::Bind( |
+ &MemoryConditionObserver::UpdateCondition, base::Unretained(this))); |
} |
MemoryConditionObserver::~MemoryConditionObserver() {} |
-void MemoryConditionObserver::ScheduleUpdateCondition(base::TimeDelta delta) { |
- update_condition_closure_.Reset(base::Bind( |
- &MemoryConditionObserver::UpdateCondition, base::Unretained(this))); |
+void MemoryConditionObserver::ScheduleUpdateCondition( |
+ base::TimeDelta interval) { |
+ if (!interval.is_zero() && interval != monitoring_interval_) { |
+ monitoring_interval_ = interval; |
+ update_condition_closure_.Reset(base::Bind( |
+ &MemoryConditionObserver::UpdateCondition, base::Unretained(this))); |
+ } |
task_runner_->PostDelayedTask(FROM_HERE, update_condition_closure_.callback(), |
- delta); |
+ interval); |
} |
MemoryCondition MemoryConditionObserver::CalculateNextCondition() { |
- int available = |
- coordinator_->memory_monitor()->GetFreeMemoryUntilCriticalMB(); |
- |
- // TODO(chrisha): Move this histogram recording to a better place when |
- // https://codereview.chromium.org/2479673002/ is landed. |
- UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Coordinator.FreeMemoryUntilCritical", |
- available); |
- |
- if (available <= 0) |
+ if (current_available_ <= 0) |
return MemoryCondition::CRITICAL; |
- auto current = coordinator_->GetMemoryCondition(); |
- int expected_renderer_count = available / expected_renderer_size_; |
+ auto current_condition = coordinator_->GetMemoryCondition(); |
+ int expected_renderer_count = current_available_ / expected_renderer_size_; |
- switch (current) { |
+ switch (current_condition) { |
case MemoryCondition::NORMAL: |
if (expected_renderer_count <= new_renderers_until_critical_) |
return MemoryCondition::CRITICAL; |
@@ -117,7 +117,13 @@ MemoryCondition MemoryConditionObserver::CalculateNextCondition() { |
} |
void MemoryConditionObserver::UpdateCondition() { |
+ int available = |
+ coordinator_->memory_monitor()->GetFreeMemoryUntilCriticalMB(); |
+ UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Coordinator.FreeMemoryUntilCritical", |
+ available); |
+ current_available_ = std::min(available, max_available_); |
auto next_condition = CalculateNextCondition(); |
+ coordinator_->UpdateGlobalBudget(current_available_); |
coordinator_->UpdateConditionIfNeeded(next_condition); |
ScheduleUpdateCondition(monitoring_interval_); |
} |
@@ -147,6 +153,17 @@ void MemoryConditionObserver::InitializeParameters() { |
&new_renderers_back_to_warning_); |
SetSecondsVariationParameter(params, "monitoring_interval", |
&monitoring_interval_); |
+ |
+ const std::string simulate_option = |
+ base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
+ "simulate-memory-pressure"); |
+ if (simulate_option == "warning") { |
+ max_available_ = expected_renderer_size_ * new_renderers_until_warning_; |
+ } else if (simulate_option == "critical") { |
+ max_available_ = expected_renderer_size_ * new_renderers_until_critical_; |
+ } else { |
+ max_available_ = INT_MAX; |
+ } |
} |
bool MemoryConditionObserver::ValidateParameters() { |