Index: content/browser/memory/memory_coordinator.cc |
diff --git a/content/browser/memory/memory_coordinator.cc b/content/browser/memory/memory_coordinator.cc |
deleted file mode 100644 |
index fdbae591e30bed26ab77087b856eb79495dc0075..0000000000000000000000000000000000000000 |
--- a/content/browser/memory/memory_coordinator.cc |
+++ /dev/null |
@@ -1,219 +0,0 @@ |
-// Copyright 2016 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 "content/browser/memory/memory_coordinator.h" |
- |
-#include "base/memory/memory_coordinator_client_registry.h" |
-#include "base/metrics/histogram_macros.h" |
-#include "content/public/browser/content_browser_client.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/common/content_client.h" |
- |
-namespace content { |
- |
-// The implementation of MemoryCoordinatorHandle. See memory_coordinator.mojom |
-// for the role of this class. |
-class MemoryCoordinatorHandleImpl : public mojom::MemoryCoordinatorHandle { |
- public: |
- MemoryCoordinatorHandleImpl(mojom::MemoryCoordinatorHandleRequest request, |
- MemoryCoordinator* coordinator, |
- int render_process_id); |
- ~MemoryCoordinatorHandleImpl() override; |
- |
- // mojom::MemoryCoordinatorHandle: |
- void AddChild(mojom::ChildMemoryCoordinatorPtr child) override; |
- |
- mojom::ChildMemoryCoordinatorPtr& child() { return child_; } |
- mojo::Binding<mojom::MemoryCoordinatorHandle>& binding() { return binding_; } |
- |
- private: |
- MemoryCoordinator* coordinator_; |
- int render_process_id_; |
- mojom::ChildMemoryCoordinatorPtr child_; |
- mojo::Binding<mojom::MemoryCoordinatorHandle> binding_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MemoryCoordinatorHandleImpl); |
-}; |
- |
-MemoryCoordinatorHandleImpl::MemoryCoordinatorHandleImpl( |
- mojom::MemoryCoordinatorHandleRequest request, |
- MemoryCoordinator* coordinator, |
- int render_process_id) |
- : coordinator_(coordinator), |
- render_process_id_(render_process_id), |
- binding_(this, std::move(request)) { |
- DCHECK(coordinator_); |
-} |
- |
-MemoryCoordinatorHandleImpl::~MemoryCoordinatorHandleImpl() {} |
- |
-void MemoryCoordinatorHandleImpl::AddChild( |
- mojom::ChildMemoryCoordinatorPtr child) { |
- DCHECK(!child_.is_bound()); |
- child_ = std::move(child); |
- coordinator_->OnChildAdded(render_process_id_); |
-} |
- |
-MemoryCoordinator::MemoryCoordinator() |
- : delegate_(GetContentClient()->browser()->GetMemoryCoordinatorDelegate()) { |
-} |
- |
-MemoryCoordinator::~MemoryCoordinator() {} |
- |
-void MemoryCoordinator::CreateHandle( |
- int render_process_id, |
- mojom::MemoryCoordinatorHandleRequest request) { |
- std::unique_ptr<MemoryCoordinatorHandleImpl> handle( |
- new MemoryCoordinatorHandleImpl(std::move(request), this, |
- render_process_id)); |
- handle->binding().set_connection_error_handler( |
- base::Bind(&MemoryCoordinator::OnConnectionError, base::Unretained(this), |
- render_process_id)); |
- CreateChildInfoMapEntry(render_process_id, std::move(handle)); |
-} |
- |
-bool MemoryCoordinator::SetChildMemoryState(int render_process_id, |
- mojom::MemoryState memory_state) { |
- // Can't set an invalid memory state. |
- if (memory_state == mojom::MemoryState::UNKNOWN) |
- return false; |
- |
- // Can't send a message to a child that doesn't exist. |
- auto iter = children_.find(render_process_id); |
- if (iter == children_.end()) |
- return false; |
- |
- // Can't send a message to a child that isn't bound. |
- if (!iter->second.handle->child().is_bound()) |
- return false; |
- |
- memory_state = OverrideGlobalState(memory_state, iter->second); |
- |
- // A nop doesn't need to be sent, but is considered successful. |
- if (iter->second.memory_state == memory_state) |
- return true; |
- |
- // Can't suspend the given renderer. |
- if (memory_state == mojom::MemoryState::SUSPENDED && |
- !CanSuspendRenderer(render_process_id)) |
- return false; |
- |
- // Update the internal state and send the message. |
- iter->second.memory_state = memory_state; |
- iter->second.handle->child()->OnStateChange(memory_state); |
- return true; |
-} |
- |
-mojom::MemoryState MemoryCoordinator::GetChildMemoryState( |
- int render_process_id) const { |
- auto iter = children_.find(render_process_id); |
- if (iter == children_.end()) |
- return mojom::MemoryState::UNKNOWN; |
- return iter->second.memory_state; |
-} |
- |
-void MemoryCoordinator::RecordMemoryPressure( |
- base::MemoryPressureMonitor::MemoryPressureLevel level) { |
- DCHECK(GetGlobalMemoryState() != base::MemoryState::UNKNOWN); |
- int state = static_cast<int>(GetGlobalMemoryState()); |
- switch (level) { |
- case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE: |
- UMA_HISTOGRAM_ENUMERATION( |
- "Memory.Coordinator.StateOnModerateNotificationReceived", |
- state, base::kMemoryStateMax); |
- break; |
- case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL: |
- UMA_HISTOGRAM_ENUMERATION( |
- "Memory.Coordinator.StateOnCriticalNotificationReceived", |
- state, base::kMemoryStateMax); |
- break; |
- case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE: |
- NOTREACHED(); |
- } |
-} |
- |
-base::MemoryState MemoryCoordinator::GetGlobalMemoryState() const { |
- return base::MemoryState::UNKNOWN; |
-} |
- |
-base::MemoryState MemoryCoordinator::GetCurrentMemoryState() const { |
- return base::MemoryState::UNKNOWN; |
-} |
- |
-void MemoryCoordinator::SetCurrentMemoryStateForTesting( |
- base::MemoryState memory_state) { |
-} |
- |
-void MemoryCoordinator::AddChildForTesting( |
- int dummy_render_process_id, mojom::ChildMemoryCoordinatorPtr child) { |
- mojom::MemoryCoordinatorHandlePtr mch; |
- auto request = mojo::GetProxy(&mch); |
- std::unique_ptr<MemoryCoordinatorHandleImpl> handle( |
- new MemoryCoordinatorHandleImpl(std::move(request), this, |
- dummy_render_process_id)); |
- handle->AddChild(std::move(child)); |
- CreateChildInfoMapEntry(dummy_render_process_id, std::move(handle)); |
-} |
- |
-void MemoryCoordinator::OnConnectionError(int render_process_id) { |
- children_.erase(render_process_id); |
-} |
- |
-bool MemoryCoordinator::CanSuspendRenderer(int render_process_id) { |
- // If there is no delegate (i.e. unittests), renderers are always suspendable. |
- if (!delegate_) |
- return true; |
- auto* render_process_host = RenderProcessHost::FromID(render_process_id); |
- if (!render_process_host || !render_process_host->IsProcessBackgrounded()) |
- return false; |
- if (render_process_host->GetWorkerRefCount() > 0) |
- return false; |
- return delegate_->CanSuspendBackgroundedRenderer(render_process_id); |
-} |
- |
-mojom::MemoryState MemoryCoordinator::OverrideGlobalState( |
- mojom::MemoryState memory_state, |
- const ChildInfo& child) { |
- // We don't suspend foreground renderers. Throttle them instead. |
- if (child.is_visible && memory_state == mojom::MemoryState::SUSPENDED) |
- return mojom::MemoryState::THROTTLED; |
-#if defined(OS_ANDROID) |
- // On Android, we throttle background renderers immediately. |
- // TODO(bashi): Create a specialized class of MemoryCoordinator for Android |
- // and move this ifdef to the class. |
- if (!child.is_visible && memory_state == mojom::MemoryState::NORMAL) |
- return mojom::MemoryState::THROTTLED; |
- // TODO(bashi): Suspend background renderers after a certain period of time. |
-#endif // defined(OS_ANDROID) |
- return memory_state; |
-} |
- |
-void MemoryCoordinator::SetDelegateForTesting( |
- std::unique_ptr<MemoryCoordinatorDelegate> delegate) { |
- CHECK(!delegate_); |
- delegate_ = std::move(delegate); |
-} |
- |
-void MemoryCoordinator::CreateChildInfoMapEntry( |
- int render_process_id, |
- std::unique_ptr<MemoryCoordinatorHandleImpl> handle) { |
- auto& child_info = children_[render_process_id]; |
- // Process always start with normal memory state. |
- // We'll set renderer's memory state to the current global state when the |
- // corresponding renderer process is ready to communicate. Renderer processes |
- // call AddChild() when they are ready. |
- child_info.memory_state = mojom::MemoryState::NORMAL; |
- child_info.is_visible = true; |
- child_info.handle = std::move(handle); |
-} |
- |
-MemoryCoordinator::ChildInfo::ChildInfo() {} |
- |
-MemoryCoordinator::ChildInfo::ChildInfo(const ChildInfo& rhs) { |
- // This is a nop, but exists for compatibility with STL containers. |
-} |
- |
-MemoryCoordinator::ChildInfo::~ChildInfo() {} |
- |
-} // namespace content |