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 |