| 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() {
|
|
|