| Index: components/memory_coordinator/browser/memory_coordinator.cc
|
| diff --git a/components/memory_coordinator/browser/memory_coordinator.cc b/components/memory_coordinator/browser/memory_coordinator.cc
|
| index fab8c98c67b30ce97ba77dae00c677af5b43f586..eab59b3c47304d70cafea6e7c2be631714c409f3 100644
|
| --- a/components/memory_coordinator/browser/memory_coordinator.cc
|
| +++ b/components/memory_coordinator/browser/memory_coordinator.cc
|
| @@ -6,6 +6,29 @@
|
|
|
| namespace memory_coordinator {
|
|
|
| +namespace {
|
| +
|
| +MemoryCoordinator* g_coordinator = nullptr;
|
| +
|
| +// TODO(bashi): This should be a tentative translation.
|
| +mojom::MemoryState ConvertPressureLevelToMemoryState(
|
| + base::MemoryPressureMonitor::MemoryPressureLevel level) {
|
| + switch (level) {
|
| + case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE:
|
| + return mojom::MemoryState::UNKNOWN;
|
| + case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE:
|
| + return mojom::MemoryState::THROTTLED;
|
| + case base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL:
|
| + return mojom::MemoryState::SUSPENDED;
|
| + default:
|
| + break;
|
| + }
|
| + NOTREACHED();
|
| + return mojom::MemoryState::UNKNOWN;
|
| +}
|
| +
|
| +}
|
| +
|
| // The implementation of MemoryCoordinatorHandle. See memory_coordinator.mojom
|
| // for the role of this class.
|
| class MemoryCoordinatorHandleImpl : public mojom::MemoryCoordinatorHandle {
|
| @@ -31,12 +54,26 @@ class MemoryCoordinatorHandleImpl : public mojom::MemoryCoordinatorHandle {
|
| DISALLOW_COPY_AND_ASSIGN(MemoryCoordinatorHandleImpl);
|
| };
|
|
|
| +// static
|
| +MemoryCoordinator* MemoryCoordinator::GetInstance() {
|
| + return g_coordinator;
|
| +}
|
| +
|
| MemoryCoordinator::MemoryCoordinator()
|
| : pressure_level_dispatcher_(
|
| base::Bind(&MemoryCoordinator::OnMemoryPressure,
|
| - base::Unretained(this))) {}
|
| + base::Unretained(this))),
|
| + children_dispatch_callback_(
|
| + base::Bind(&MemoryCoordinator::DispatchMemoryPressureToChildren,
|
| + base::Unretained(this))) {
|
| + DCHECK(!g_coordinator);
|
| + g_coordinator = this;
|
| +}
|
|
|
| -MemoryCoordinator::~MemoryCoordinator() {}
|
| +MemoryCoordinator::~MemoryCoordinator() {
|
| + DCHECK(g_coordinator);
|
| + g_coordinator = nullptr;
|
| +}
|
|
|
| void MemoryCoordinator::CreateHandle(
|
| int render_process_id,
|
| @@ -48,6 +85,21 @@ void MemoryCoordinator::CreateHandle(
|
| children_[render_process_id].reset(handle);
|
| }
|
|
|
| +void MemoryCoordinator::SetChildrenDispatchCallback(
|
| + const DispatchCallback& callback) {
|
| + children_dispatch_callback_ = callback;
|
| +}
|
| +
|
| +void MemoryCoordinator::DispatchToRenderer(
|
| + int render_process_id,
|
| + base::MemoryPressureMonitor::MemoryPressureLevel level) {
|
| + const auto& it = children_.find(render_process_id);
|
| + if (it == children_.end()) {
|
| + return;
|
| + }
|
| + it->second->child()->OnStateChange(ConvertPressureLevelToMemoryState(level));
|
| +}
|
| +
|
| size_t MemoryCoordinator::NumChildrenForTesting() {
|
| return children_.size();
|
| }
|
| @@ -61,13 +113,18 @@ void MemoryCoordinator::OnMemoryPressure(
|
| // TODO(bashi): The current implementation just translates memory pressure
|
| // levels to memory coordinator states. The logic will be replaced with
|
| // the priority tracker.
|
| - if (level == base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE) {
|
| - clients()->Notify(FROM_HERE, &MemoryCoordinatorClient::OnMemoryStateChange,
|
| - mojom::MemoryState::THROTTLED);
|
| - } else if (level ==
|
| - base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL) {
|
| - clients()->Notify(FROM_HERE, &MemoryCoordinatorClient::OnMemoryStateChange,
|
| - mojom::MemoryState::SUSPENDED);
|
| + auto state = ConvertPressureLevelToMemoryState(level);
|
| + clients()->Notify(FROM_HERE, &MemoryCoordinatorClient::OnMemoryStateChange,
|
| + state);
|
| +
|
| + children_dispatch_callback_.Run(level);
|
| +}
|
| +
|
| +void MemoryCoordinator::DispatchMemoryPressureToChildren(
|
| + base::MemoryPressureMonitor::MemoryPressureLevel level) {
|
| + auto state = ConvertPressureLevelToMemoryState(level);
|
| + for (auto& pair : children_) {
|
| + pair.second->child()->OnStateChange(state);
|
| }
|
| }
|
|
|
|
|