OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/browser/renderer_host/render_process_host.h" | 5 #include "content/browser/renderer_host/render_process_host.h" |
6 | 6 |
7 #include "base/rand_util.h" | 7 #include "base/rand_util.h" |
8 #include "base/sys_info.h" | 8 #include "base/sys_info.h" |
| 9 #include "chrome/browser/profiles/profile.h" |
9 #include "content/browser/browser_thread.h" | 10 #include "content/browser/browser_thread.h" |
10 #include "content/browser/child_process_security_policy.h" | 11 #include "content/browser/child_process_security_policy.h" |
11 #include "content/common/child_process_info.h" | 12 #include "content/common/child_process_info.h" |
12 #include "content/common/content_constants.h" | 13 #include "content/common/content_constants.h" |
13 #include "content/common/notification_service.h" | 14 #include "content/common/notification_service.h" |
14 | 15 |
15 namespace { | 16 namespace { |
16 | 17 |
17 size_t max_renderer_count_override = 0; | 18 size_t max_renderer_count_override = 0; |
18 | 19 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 size_t memory_tier = base::SysInfo::AmountOfPhysicalMemoryMB() / 256; | 53 size_t memory_tier = base::SysInfo::AmountOfPhysicalMemoryMB() / 256; |
53 if (memory_tier >= arraysize(kMaxRenderersByRamTier)) | 54 if (memory_tier >= arraysize(kMaxRenderersByRamTier)) |
54 max_count = content::kMaxRendererProcessCount; | 55 max_count = content::kMaxRendererProcessCount; |
55 else | 56 else |
56 max_count = kMaxRenderersByRamTier[memory_tier]; | 57 max_count = kMaxRenderersByRamTier[memory_tier]; |
57 } | 58 } |
58 return max_count; | 59 return max_count; |
59 } | 60 } |
60 | 61 |
61 // Returns true if the given host is suitable for launching a new view | 62 // Returns true if the given host is suitable for launching a new view |
62 // associated with the given profile. | 63 // associated with the given browser context. |
63 static bool IsSuitableHost(RenderProcessHost* host, Profile* profile, | 64 static bool IsSuitableHost(RenderProcessHost* host, |
| 65 content::BrowserContext* browser_context, |
64 RenderProcessHost::Type type) { | 66 RenderProcessHost::Type type) { |
65 if (host->profile() != profile) | 67 if (host->browser_context() != browser_context) |
66 return false; | 68 return false; |
67 | 69 |
68 RenderProcessHost::Type host_type = RenderProcessHost::TYPE_NORMAL; | 70 RenderProcessHost::Type host_type = RenderProcessHost::TYPE_NORMAL; |
69 if (ChildProcessSecurityPolicy::GetInstance()->HasWebUIBindings(host->id())) | 71 if (ChildProcessSecurityPolicy::GetInstance()->HasWebUIBindings(host->id())) |
70 host_type = RenderProcessHost::TYPE_WEBUI; | 72 host_type = RenderProcessHost::TYPE_WEBUI; |
71 if (ChildProcessSecurityPolicy::GetInstance()-> | 73 if (ChildProcessSecurityPolicy::GetInstance()-> |
72 HasExtensionBindings(host->id())) | 74 HasExtensionBindings(host->id())) |
73 host_type = RenderProcessHost::TYPE_EXTENSION; | 75 host_type = RenderProcessHost::TYPE_EXTENSION; |
74 | 76 |
75 return host_type == type; | 77 return host_type == type; |
76 } | 78 } |
77 | 79 |
78 // the global list of all renderer processes | 80 // the global list of all renderer processes |
79 IDMap<RenderProcessHost> all_hosts; | 81 IDMap<RenderProcessHost> all_hosts; |
80 | 82 |
81 } // namespace | 83 } // namespace |
82 | 84 |
83 extern bool g_log_bug53991; | 85 extern bool g_log_bug53991; |
84 | 86 |
85 // static | 87 // static |
86 bool RenderProcessHost::run_renderer_in_process_ = false; | 88 bool RenderProcessHost::run_renderer_in_process_ = false; |
87 | 89 |
88 // static | 90 // static |
89 void RenderProcessHost::SetMaxRendererProcessCount(size_t count) { | 91 void RenderProcessHost::SetMaxRendererProcessCount(size_t count) { |
90 max_renderer_count_override = count; | 92 max_renderer_count_override = count; |
91 } | 93 } |
92 | 94 |
93 RenderProcessHost::RenderProcessHost(Profile* profile) | 95 RenderProcessHost::RenderProcessHost(content::BrowserContext* browser_context) |
94 : max_page_id_(-1), | 96 : max_page_id_(-1), |
95 fast_shutdown_started_(false), | 97 fast_shutdown_started_(false), |
96 deleting_soon_(false), | 98 deleting_soon_(false), |
97 is_extension_process_(false), | 99 is_extension_process_(false), |
98 pending_views_(0), | 100 pending_views_(0), |
99 id_(ChildProcessInfo::GenerateChildProcessUniqueId()), | 101 id_(ChildProcessInfo::GenerateChildProcessUniqueId()), |
100 profile_(profile), | 102 browser_context_(browser_context), |
101 sudden_termination_allowed_(true), | 103 sudden_termination_allowed_(true), |
102 ignore_input_events_(false) { | 104 ignore_input_events_(false) { |
103 all_hosts.AddWithID(this, id()); | 105 all_hosts.AddWithID(this, id()); |
104 all_hosts.set_check_on_null_data(true); | 106 all_hosts.set_check_on_null_data(true); |
105 // Initialize |child_process_activity_time_| to a reasonable value. | 107 // Initialize |child_process_activity_time_| to a reasonable value. |
106 mark_child_process_activity_time(); | 108 mark_child_process_activity_time(); |
107 } | 109 } |
108 | 110 |
109 RenderProcessHost::~RenderProcessHost() { | 111 RenderProcessHost::~RenderProcessHost() { |
110 // In unit tests, Release() might not have been called. | 112 // In unit tests, Release() might not have been called. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
176 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 178 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
177 return all_hosts.Lookup(render_process_id); | 179 return all_hosts.Lookup(render_process_id); |
178 } | 180 } |
179 | 181 |
180 // static | 182 // static |
181 bool RenderProcessHost::ShouldTryToUseExistingProcessHost() { | 183 bool RenderProcessHost::ShouldTryToUseExistingProcessHost() { |
182 size_t renderer_process_count = all_hosts.size(); | 184 size_t renderer_process_count = all_hosts.size(); |
183 | 185 |
184 // NOTE: Sometimes it's necessary to create more render processes than | 186 // NOTE: Sometimes it's necessary to create more render processes than |
185 // GetMaxRendererProcessCount(), for instance when we want to create | 187 // GetMaxRendererProcessCount(), for instance when we want to create |
186 // a renderer process for a profile that has no existing renderers. | 188 // a renderer process for a browser context that has no existing |
187 // This is OK in moderation, since the GetMaxRendererProcessCount() | 189 // renderers. This is OK in moderation, since the |
188 // is conservative. | 190 // GetMaxRendererProcessCount() is conservative. |
189 | 191 |
190 return run_renderer_in_process() || | 192 return run_renderer_in_process() || |
191 (renderer_process_count >= GetMaxRendererProcessCount()); | 193 (renderer_process_count >= GetMaxRendererProcessCount()); |
192 } | 194 } |
193 | 195 |
194 // static | 196 // static |
195 RenderProcessHost* RenderProcessHost::GetExistingProcessHost(Profile* profile, | 197 RenderProcessHost* RenderProcessHost::GetExistingProcessHost( |
196 Type type) { | 198 content::BrowserContext* browser_context, Type type) { |
197 // First figure out which existing renderers we can use. | 199 // First figure out which existing renderers we can use. |
198 std::vector<RenderProcessHost*> suitable_renderers; | 200 std::vector<RenderProcessHost*> suitable_renderers; |
199 suitable_renderers.reserve(all_hosts.size()); | 201 suitable_renderers.reserve(all_hosts.size()); |
200 | 202 |
201 iterator iter(AllHostsIterator()); | 203 iterator iter(AllHostsIterator()); |
202 while (!iter.IsAtEnd()) { | 204 while (!iter.IsAtEnd()) { |
203 if (run_renderer_in_process() || | 205 if (run_renderer_in_process() || |
204 IsSuitableHost(iter.GetCurrentValue(), profile, type)) | 206 IsSuitableHost(iter.GetCurrentValue(), browser_context, type)) |
205 suitable_renderers.push_back(iter.GetCurrentValue()); | 207 suitable_renderers.push_back(iter.GetCurrentValue()); |
206 | 208 |
207 iter.Advance(); | 209 iter.Advance(); |
208 } | 210 } |
209 | 211 |
210 // Now pick a random suitable renderer, if we have any. | 212 // Now pick a random suitable renderer, if we have any. |
211 if (!suitable_renderers.empty()) { | 213 if (!suitable_renderers.empty()) { |
212 int suitable_count = static_cast<int>(suitable_renderers.size()); | 214 int suitable_count = static_cast<int>(suitable_renderers.size()); |
213 int random_index = base::RandInt(0, suitable_count - 1); | 215 int random_index = base::RandInt(0, suitable_count - 1); |
214 return suitable_renderers[random_index]; | 216 return suitable_renderers[random_index]; |
215 } | 217 } |
216 | 218 |
217 return NULL; | 219 return NULL; |
218 } | 220 } |
OLD | NEW |