Chromium Code Reviews| 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/child/memory/child_memory_coordinator_impl.h" | 5 #include "content/child/memory/child_memory_coordinator_impl.h" |
| 6 | 6 |
| 7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
| 8 #include "base/memory/memory_coordinator_client_registry.h" | 8 #include "base/memory/memory_coordinator_client_registry.h" |
| 9 #include "base/memory/memory_coordinator_proxy.h" | |
| 9 #include "base/synchronization/lock.h" | 10 #include "base/synchronization/lock.h" |
| 10 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
| 11 | 12 |
| 12 namespace content { | 13 namespace content { |
| 13 | 14 |
| 14 namespace { | 15 namespace { |
| 15 | 16 |
| 16 base::LazyInstance<base::Lock>::Leaky g_lock = LAZY_INSTANCE_INITIALIZER; | 17 base::LazyInstance<base::Lock>::Leaky g_lock = LAZY_INSTANCE_INITIALIZER; |
| 17 ChildMemoryCoordinatorImpl* g_child_memory_coordinator = nullptr; | 18 ChildMemoryCoordinatorImpl* g_child_memory_coordinator = nullptr; |
| 18 | 19 |
| 19 base::MemoryState ToBaseMemoryState(mojom::MemoryState state) { | 20 base::MemoryState ToBaseMemoryState(mojom::MemoryState state) { |
| 20 switch (state) { | 21 switch (state) { |
| 21 case mojom::MemoryState::UNKNOWN: | 22 case mojom::MemoryState::UNKNOWN: |
| 22 return base::MemoryState::UNKNOWN; | 23 return base::MemoryState::UNKNOWN; |
| 23 case mojom::MemoryState::NORMAL: | 24 case mojom::MemoryState::NORMAL: |
| 24 return base::MemoryState::NORMAL; | 25 return base::MemoryState::NORMAL; |
| 25 case mojom::MemoryState::THROTTLED: | 26 case mojom::MemoryState::THROTTLED: |
| 26 return base::MemoryState::THROTTLED; | 27 return base::MemoryState::THROTTLED; |
| 27 case mojom::MemoryState::SUSPENDED: | 28 case mojom::MemoryState::SUSPENDED: |
| 28 return base::MemoryState::SUSPENDED; | 29 return base::MemoryState::SUSPENDED; |
| 29 default: | 30 default: |
| 30 NOTREACHED(); | 31 NOTREACHED(); |
| 31 return base::MemoryState::UNKNOWN; | 32 return base::MemoryState::UNKNOWN; |
| 32 } | 33 } |
| 33 } | 34 } |
| 34 | 35 |
| 36 // Wrapper for GetCurrentMemoryState that converts converts to a | |
| 37 // base::MemoryState. | |
| 38 base::MemoryState GetCurrentMemoryState() { | |
| 39 return ToBaseMemoryState(g_child_memory_coordinator->GetCurrentMemoryState()); | |
|
haraken
2016/11/05 12:52:22
g_child_memory_coordinator => GetInstance() ?
chrisha
2016/11/07 19:33:41
Done.
| |
| 40 } | |
| 41 | |
| 35 } // namespace | 42 } // namespace |
| 36 | 43 |
| 37 // static | 44 // static |
| 38 ChildMemoryCoordinatorImpl* ChildMemoryCoordinatorImpl::GetInstance() { | 45 ChildMemoryCoordinatorImpl* ChildMemoryCoordinatorImpl::GetInstance() { |
| 39 base::AutoLock lock(*g_lock.Pointer()); | 46 base::AutoLock lock(*g_lock.Pointer()); |
| 40 return g_child_memory_coordinator; | 47 return g_child_memory_coordinator; |
| 41 } | 48 } |
| 42 | 49 |
| 43 ChildMemoryCoordinatorImpl::ChildMemoryCoordinatorImpl( | 50 ChildMemoryCoordinatorImpl::ChildMemoryCoordinatorImpl( |
| 44 mojom::MemoryCoordinatorHandlePtr parent, | 51 mojom::MemoryCoordinatorHandlePtr parent, |
| 45 ChildMemoryCoordinatorDelegate* delegate) | 52 ChildMemoryCoordinatorDelegate* delegate) |
| 46 : binding_(this), parent_(std::move(parent)), delegate_(delegate) { | 53 : binding_(this), parent_(std::move(parent)), delegate_(delegate), |
| 54 state_(mojom::MemoryState::UNKNOWN), remaining_global_budget_mb_(0) { | |
| 47 base::AutoLock lock(*g_lock.Pointer()); | 55 base::AutoLock lock(*g_lock.Pointer()); |
| 48 DCHECK(delegate_); | 56 DCHECK(delegate_); |
| 49 DCHECK(!g_child_memory_coordinator); | 57 DCHECK(!g_child_memory_coordinator); |
| 50 g_child_memory_coordinator = this; | 58 g_child_memory_coordinator = this; |
| 51 parent_->AddChild(binding_.CreateInterfacePtrAndBind()); | 59 parent_->AddChild(binding_.CreateInterfacePtrAndBind()); |
| 52 } | 60 } |
| 53 | 61 |
| 54 ChildMemoryCoordinatorImpl::~ChildMemoryCoordinatorImpl() { | 62 ChildMemoryCoordinatorImpl::~ChildMemoryCoordinatorImpl() { |
| 55 base::AutoLock lock(*g_lock.Pointer()); | 63 base::AutoLock lock(*g_lock.Pointer()); |
| 56 DCHECK(g_child_memory_coordinator == this); | 64 DCHECK(g_child_memory_coordinator == this); |
| 57 g_child_memory_coordinator = nullptr; | 65 g_child_memory_coordinator = nullptr; |
| 58 } | 66 } |
| 59 | 67 |
| 60 void ChildMemoryCoordinatorImpl::OnStateChange(mojom::MemoryState state) { | 68 void ChildMemoryCoordinatorImpl::OnStateChange(mojom::MemoryState state) { |
| 61 base::MemoryState base_state = ToBaseMemoryState(state); | 69 base::MemoryState base_state = ToBaseMemoryState(state); |
| 62 TRACE_EVENT1("memory-infra", "ChildMemoryCoordinatorImpl::OnStateChange", | 70 TRACE_EVENT1("memory-infra", "ChildMemoryCoordinatorImpl::OnStateChange", |
| 63 "state", MemoryStateToString(base_state)); | 71 "state", MemoryStateToString(base_state)); |
| 64 base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( | 72 base::MemoryCoordinatorClientRegistry::GetInstance()->Notify( |
| 65 base_state); | 73 base_state); |
| 66 } | 74 } |
| 67 | 75 |
| 76 void ChildMemoryCoordinatorImpl::SetRemainingGlobalBudget( | |
| 77 int64_t remaining_global_budget_mb) { | |
| 78 remaining_global_budget_mb_ = remaining_global_budget_mb; | |
| 79 } | |
| 80 | |
| 68 #if !defined(OS_ANDROID) | 81 #if !defined(OS_ANDROID) |
| 69 std::unique_ptr<ChildMemoryCoordinatorImpl> CreateChildMemoryCoordinator( | 82 std::unique_ptr<ChildMemoryCoordinatorImpl> CreateChildMemoryCoordinator( |
| 70 mojom::MemoryCoordinatorHandlePtr parent, | 83 mojom::MemoryCoordinatorHandlePtr parent, |
| 71 ChildMemoryCoordinatorDelegate* delegate) { | 84 ChildMemoryCoordinatorDelegate* delegate) { |
| 72 return base::WrapUnique( | 85 auto* cmc = new ChildMemoryCoordinatorImpl(std::move(parent), delegate); |
| 73 new ChildMemoryCoordinatorImpl(std::move(parent), delegate)); | 86 |
| 87 // Hookup the coordinator to the MemoryCoordinatorProxy. base::Unretained is | |
| 88 // safe because the lifetime of the ChildMemoryCoordinatorImpl is tied to the | |
| 89 // lifetime of the renderer process. | |
| 90 base::MemoryCoordinatorProxy::GetInstance()-> | |
| 91 SetGetCurrentMemoryStateCallback(base::Bind(&GetCurrentMemoryState)); | |
| 92 base::MemoryCoordinatorProxy::GetInstance()-> | |
| 93 SetGetRemainingGlobalBudgetCallback(base::Bind( | |
| 94 &ChildMemoryCoordinatorImpl::GetRemainingGlobalBudget, | |
| 95 base::Unretained(cmc))); | |
| 96 | |
| 97 return base::WrapUnique(cmc); | |
| 74 } | 98 } |
| 75 #endif | 99 #endif |
| 76 | 100 |
| 77 } // namespace content | 101 } // namespace content |
| OLD | NEW |