Index: content/browser/memory/memory_coordinator.cc |
diff --git a/content/browser/memory/memory_coordinator.cc b/content/browser/memory/memory_coordinator.cc |
index 52ee2ece71f8a47def79edd5401bd9c791680b49..8cf5697577a3d8e8b6de4a17a55348802f7ea5d3 100644 |
--- a/content/browser/memory/memory_coordinator.cc |
+++ b/content/browser/memory/memory_coordinator.cc |
@@ -5,7 +5,6 @@ |
#include "content/browser/memory/memory_coordinator.h" |
#include "base/memory/memory_coordinator_client_registry.h" |
-#include "content/public/common/content_features.h" |
namespace content { |
@@ -13,32 +12,43 @@ namespace content { |
// for the role of this class. |
class MemoryCoordinatorHandleImpl : public mojom::MemoryCoordinatorHandle { |
public: |
- MemoryCoordinatorHandleImpl(mojom::MemoryCoordinatorHandleRequest request) |
- : binding_(this, std::move(request)) { |
- } |
+ MemoryCoordinatorHandleImpl(mojom::MemoryCoordinatorHandleRequest request, |
+ MemoryCoordinator* coordinator, |
+ int render_process_id); |
+ ~MemoryCoordinatorHandleImpl() override; |
// mojom::MemoryCoordinatorHandle: |
- void AddChild(mojom::ChildMemoryCoordinatorPtr child) override { |
- DCHECK(!child_.is_bound()); |
- child_ = std::move(child); |
- } |
+ 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); |
}; |
-// static |
-MemoryCoordinator* MemoryCoordinator::GetInstance() { |
- if (!base::FeatureList::IsEnabled(features::kMemoryCoordinator)) |
- return nullptr; |
- return base::Singleton<MemoryCoordinator, |
- base::LeakySingletonTraits<MemoryCoordinator>>::get(); |
+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() {} |
@@ -49,7 +59,8 @@ void MemoryCoordinator::CreateHandle( |
int render_process_id, |
mojom::MemoryCoordinatorHandleRequest request) { |
std::unique_ptr<MemoryCoordinatorHandleImpl> handle( |
- new MemoryCoordinatorHandleImpl(std::move(request))); |
+ 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)); |
@@ -71,6 +82,10 @@ bool MemoryCoordinator::SetMemoryState(int 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; |
+ |
// A nop doesn't need to be sent, but is considered successful. |
if (iter->second.memory_state == memory_state) |
return true; |
@@ -94,7 +109,8 @@ void MemoryCoordinator::AddChildForTesting( |
mojom::MemoryCoordinatorHandlePtr mch; |
auto request = mojo::GetProxy(&mch); |
std::unique_ptr<MemoryCoordinatorHandleImpl> handle( |
- new MemoryCoordinatorHandleImpl(std::move(request))); |
+ new MemoryCoordinatorHandleImpl(std::move(request), this, |
+ dummy_render_process_id)); |
handle->AddChild(std::move(child)); |
CreateChildInfoMapEntry(dummy_render_process_id, std::move(handle)); |
} |