| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/memory/memory_coordinator_impl.h" | 5 #include "content/browser/memory/memory_coordinator_impl.h" |
| 6 | 6 |
| 7 #include "base/memory/memory_coordinator_client_registry.h" | 7 #include "base/memory/memory_coordinator_client_registry.h" |
| 8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/process/process_handle.h" | 10 #include "base/process/process_handle.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 // for the role of this class. | 82 // for the role of this class. |
| 83 class MemoryCoordinatorHandleImpl : public mojom::MemoryCoordinatorHandle { | 83 class MemoryCoordinatorHandleImpl : public mojom::MemoryCoordinatorHandle { |
| 84 public: | 84 public: |
| 85 MemoryCoordinatorHandleImpl(mojom::MemoryCoordinatorHandleRequest request, | 85 MemoryCoordinatorHandleImpl(mojom::MemoryCoordinatorHandleRequest request, |
| 86 MemoryCoordinatorImpl* coordinator, | 86 MemoryCoordinatorImpl* coordinator, |
| 87 int render_process_id); | 87 int render_process_id); |
| 88 ~MemoryCoordinatorHandleImpl() override; | 88 ~MemoryCoordinatorHandleImpl() override; |
| 89 | 89 |
| 90 // mojom::MemoryCoordinatorHandle: | 90 // mojom::MemoryCoordinatorHandle: |
| 91 void AddChild(mojom::ChildMemoryCoordinatorPtr child) override; | 91 void AddChild(mojom::ChildMemoryCoordinatorPtr child) override; |
| 92 void GetGlobalBudgetHandle( |
| 93 const GetGlobalBudgetHandleCallback& callback) override { |
| 94 auto handle = coordinator_->global_budget_handle_->Clone( |
| 95 mojo::SharedBufferHandle::AccessMode::READ_ONLY); |
| 96 callback.Run(std::move(handle)); |
| 97 } |
| 98 void SetGlobalBudgetUpdateInterval(uint32_t interval_ms) override { |
| 99 base::TimeDelta interval = base::TimeDelta::FromMilliseconds(interval_ms); |
| 100 coordinator_->condition_observer_->ScheduleUpdateCondition(interval); |
| 101 } |
| 92 | 102 |
| 93 mojom::ChildMemoryCoordinatorPtr& child() { return child_; } | 103 mojom::ChildMemoryCoordinatorPtr& child() { return child_; } |
| 94 mojo::Binding<mojom::MemoryCoordinatorHandle>& binding() { return binding_; } | 104 mojo::Binding<mojom::MemoryCoordinatorHandle>& binding() { return binding_; } |
| 95 | 105 |
| 96 private: | 106 private: |
| 97 MemoryCoordinatorImpl* coordinator_; | 107 MemoryCoordinatorImpl* coordinator_; |
| 98 int render_process_id_; | 108 int render_process_id_; |
| 99 mojom::ChildMemoryCoordinatorPtr child_; | 109 mojom::ChildMemoryCoordinatorPtr child_; |
| 100 mojo::Binding<mojom::MemoryCoordinatorHandle> binding_; | 110 mojo::Binding<mojom::MemoryCoordinatorHandle> binding_; |
| 101 | 111 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 MemoryCoordinatorImplSingletonTraits>::get(); | 154 MemoryCoordinatorImplSingletonTraits>::get(); |
| 145 } | 155 } |
| 146 | 156 |
| 147 MemoryCoordinatorImpl::MemoryCoordinatorImpl( | 157 MemoryCoordinatorImpl::MemoryCoordinatorImpl( |
| 148 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 158 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
| 149 std::unique_ptr<MemoryMonitor> memory_monitor) | 159 std::unique_ptr<MemoryMonitor> memory_monitor) |
| 150 : delegate_(GetContentClient()->browser()->GetMemoryCoordinatorDelegate()), | 160 : delegate_(GetContentClient()->browser()->GetMemoryCoordinatorDelegate()), |
| 151 memory_monitor_(std::move(memory_monitor)), | 161 memory_monitor_(std::move(memory_monitor)), |
| 152 condition_observer_( | 162 condition_observer_( |
| 153 base::MakeUnique<MemoryConditionObserver>(this, task_runner)), | 163 base::MakeUnique<MemoryConditionObserver>(this, task_runner)), |
| 154 minimum_state_transition_period_(base::TimeDelta::FromSeconds( | 164 minimum_state_transition_period_( |
| 155 kDefaultMinimumTransitionPeriodSeconds)) { | 165 base::TimeDelta::FromSeconds(kDefaultMinimumTransitionPeriodSeconds)), |
| 166 global_budget_handle_(mojo::SharedBufferHandle::Create(sizeof(int64_t))), |
| 167 global_budget_mapping_(global_budget_handle_->Map(sizeof(int64_t))) { |
| 156 DCHECK(memory_monitor_.get()); | 168 DCHECK(memory_monitor_.get()); |
| 169 DCHECK(global_budget_mapping_.get()); |
| 157 base::MemoryCoordinatorProxy::SetMemoryCoordinator(this); | 170 base::MemoryCoordinatorProxy::SetMemoryCoordinator(this); |
| 171 UpdateGlobalBudget(-1); |
| 158 } | 172 } |
| 159 | 173 |
| 160 MemoryCoordinatorImpl::~MemoryCoordinatorImpl() { | 174 MemoryCoordinatorImpl::~MemoryCoordinatorImpl() { |
| 161 base::MemoryCoordinatorProxy::SetMemoryCoordinator(nullptr); | 175 base::MemoryCoordinatorProxy::SetMemoryCoordinator(nullptr); |
| 162 } | 176 } |
| 163 | 177 |
| 164 void MemoryCoordinatorImpl::Start() { | 178 void MemoryCoordinatorImpl::Start() { |
| 165 DCHECK(CalledOnValidThread()); | 179 DCHECK(CalledOnValidThread()); |
| 166 DCHECK(last_state_change_.is_null()); | 180 DCHECK(last_state_change_.is_null()); |
| 167 | 181 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 225 | 239 |
| 226 void MemoryCoordinatorImpl::RecordMemoryPressure( | 240 void MemoryCoordinatorImpl::RecordMemoryPressure( |
| 227 base::MemoryPressureMonitor::MemoryPressureLevel level) { | 241 base::MemoryPressureMonitor::MemoryPressureLevel level) { |
| 228 // TODO(bashi): Record memory pressure level. | 242 // TODO(bashi): Record memory pressure level. |
| 229 } | 243 } |
| 230 | 244 |
| 231 MemoryState MemoryCoordinatorImpl::GetCurrentMemoryState() const { | 245 MemoryState MemoryCoordinatorImpl::GetCurrentMemoryState() const { |
| 232 return browser_memory_state_; | 246 return browser_memory_state_; |
| 233 } | 247 } |
| 234 | 248 |
| 249 int64_t MemoryCoordinatorImpl::GetGlobalBudget() { |
| 250 return *reinterpret_cast<int64_t*>(global_budget_mapping_.get()); |
| 251 } |
| 252 |
| 253 void MemoryCoordinatorImpl::SetGlobalBudgetUpdateInterval( |
| 254 uint32_t interval_ms) { |
| 255 condition_observer_->ScheduleUpdateCondition( |
| 256 base::TimeDelta::FromMilliseconds(interval_ms)); |
| 257 } |
| 258 |
| 235 void MemoryCoordinatorImpl::ForceSetMemoryCondition(MemoryCondition condition, | 259 void MemoryCoordinatorImpl::ForceSetMemoryCondition(MemoryCondition condition, |
| 236 base::TimeDelta duration) { | 260 base::TimeDelta duration) { |
| 237 UpdateConditionIfNeeded(condition); | 261 UpdateConditionIfNeeded(condition); |
| 238 condition_observer_->ScheduleUpdateCondition(duration); | 262 condition_observer_->ScheduleUpdateCondition(duration); |
| 239 } | 263 } |
| 240 | 264 |
| 241 void MemoryCoordinatorImpl::Observe(int type, | 265 void MemoryCoordinatorImpl::Observe(int type, |
| 242 const NotificationSource& source, | 266 const NotificationSource& source, |
| 243 const NotificationDetails& details) { | 267 const NotificationDetails& details) { |
| 244 DCHECK(type == NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED); | 268 DCHECK(type == NOTIFICATION_RENDER_WIDGET_VISIBILITY_CHANGED); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 302 SetChildMemoryState(iter.first, state); | 326 SetChildMemoryState(iter.first, state); |
| 303 } | 327 } |
| 304 // Idea: Purge memory from background processes. | 328 // Idea: Purge memory from background processes. |
| 305 } else if (next_condition == MemoryCondition::CRITICAL) { | 329 } else if (next_condition == MemoryCondition::CRITICAL) { |
| 306 // Set THROTTLED state to all clients/processes. | 330 // Set THROTTLED state to all clients/processes. |
| 307 UpdateBrowserStateAndNotifyStateToClients(MemoryState::THROTTLED); | 331 UpdateBrowserStateAndNotifyStateToClients(MemoryState::THROTTLED); |
| 308 NotifyStateToChildren(MemoryState::THROTTLED); | 332 NotifyStateToChildren(MemoryState::THROTTLED); |
| 309 } | 333 } |
| 310 } | 334 } |
| 311 | 335 |
| 336 void MemoryCoordinatorImpl::UpdateGlobalBudget(int budget) { |
| 337 *reinterpret_cast<int64_t*>(global_budget_mapping_.get()) = budget; |
| 338 } |
| 339 |
| 312 void MemoryCoordinatorImpl::DiscardTab() { | 340 void MemoryCoordinatorImpl::DiscardTab() { |
| 313 if (delegate_) | 341 if (delegate_) |
| 314 delegate_->DiscardTab(); | 342 delegate_->DiscardTab(); |
| 315 } | 343 } |
| 316 | 344 |
| 317 RenderProcessHost* MemoryCoordinatorImpl::GetRenderProcessHost( | 345 RenderProcessHost* MemoryCoordinatorImpl::GetRenderProcessHost( |
| 318 int render_process_id) { | 346 int render_process_id) { |
| 319 return RenderProcessHost::FromID(render_process_id); | 347 return RenderProcessHost::FromID(render_process_id); |
| 320 } | 348 } |
| 321 | 349 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 | 463 |
| 436 MemoryCoordinatorImpl::ChildInfo::ChildInfo() {} | 464 MemoryCoordinatorImpl::ChildInfo::ChildInfo() {} |
| 437 | 465 |
| 438 MemoryCoordinatorImpl::ChildInfo::ChildInfo(const ChildInfo& rhs) { | 466 MemoryCoordinatorImpl::ChildInfo::ChildInfo(const ChildInfo& rhs) { |
| 439 // This is a nop, but exists for compatibility with STL containers. | 467 // This is a nop, but exists for compatibility with STL containers. |
| 440 } | 468 } |
| 441 | 469 |
| 442 MemoryCoordinatorImpl::ChildInfo::~ChildInfo() {} | 470 MemoryCoordinatorImpl::ChildInfo::~ChildInfo() {} |
| 443 | 471 |
| 444 } // namespace content | 472 } // namespace content |
| OLD | NEW |