Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/memory_details.h" | 5 #include "chrome/browser/memory_details.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/file_version_info.h" | 8 #include "base/file_version_info.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/process_util.h" | 10 #include "base/process_util.h" |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 220 // Ignore processes that don't have a connection, such as crashed tabs. | 220 // Ignore processes that don't have a connection, such as crashed tabs. |
| 221 if (!render_process_host->HasConnection() || | 221 if (!render_process_host->HasConnection() || |
| 222 process.pid != base::GetProcId(render_process_host->GetHandle())) { | 222 process.pid != base::GetProcId(render_process_host->GetHandle())) { |
| 223 continue; | 223 continue; |
| 224 } | 224 } |
| 225 process.type = content::PROCESS_TYPE_RENDERER; | 225 process.type = content::PROCESS_TYPE_RENDERER; |
| 226 Profile* profile = | 226 Profile* profile = |
| 227 Profile::FromBrowserContext( | 227 Profile::FromBrowserContext( |
| 228 render_process_host->GetBrowserContext()); | 228 render_process_host->GetBrowserContext()); |
| 229 ExtensionService* extension_service = profile->GetExtensionService(); | 229 ExtensionService* extension_service = profile->GetExtensionService(); |
| 230 extensions::ProcessMap* extension_process_map = | 230 extensions::ProcessMap* extension_process_map = NULL; |
| 231 extension_service->process_map(); | 231 // No extensions on Android. |
| 232 if (extension_service != NULL) | |
|
jam
2012/10/03 21:00:13
nit: chrome style is to skip the "!= NULL"
whywhat
2012/10/04 09:58:31
Done.
| |
| 233 extension_process_map = extension_service->process_map(); | |
| 232 | 234 |
| 233 // The RenderProcessHost may host multiple WebContentses. Any | 235 // The RenderProcessHost may host multiple WebContentses. Any |
| 234 // of them which contain diagnostics information make the whole | 236 // of them which contain diagnostics information make the whole |
| 235 // process be considered a diagnostics process. | 237 // process be considered a diagnostics process. |
| 236 content::RenderProcessHost::RenderWidgetHostsIterator iter( | 238 content::RenderProcessHost::RenderWidgetHostsIterator iter( |
| 237 render_process_host->GetRenderWidgetHostsIterator()); | 239 render_process_host->GetRenderWidgetHostsIterator()); |
| 238 for (; !iter.IsAtEnd(); iter.Advance()) { | 240 for (; !iter.IsAtEnd(); iter.Advance()) { |
| 239 const RenderWidgetHost* widget = iter.GetCurrentValue(); | 241 const RenderWidgetHost* widget = iter.GetCurrentValue(); |
| 240 DCHECK(widget); | 242 DCHECK(widget); |
| 241 if (!widget || !widget->IsRenderView()) | 243 if (!widget || !widget->IsRenderView()) |
| 242 continue; | 244 continue; |
| 243 | 245 |
| 244 RenderViewHost* host = | 246 RenderViewHost* host = |
| 245 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget)); | 247 RenderViewHost::From(const_cast<RenderWidgetHost*>(widget)); |
| 246 WebContents* contents = WebContents::FromRenderViewHost(host); | 248 WebContents* contents = WebContents::FromRenderViewHost(host); |
| 247 GURL url; | 249 GURL url; |
| 248 if (contents) | 250 if (contents) |
| 249 url = contents->GetURL(); | 251 url = contents->GetURL(); |
| 250 chrome::ViewType type = chrome::GetViewType(contents); | 252 chrome::ViewType type = chrome::GetViewType(contents); |
| 251 if (host->GetEnabledBindings() & content::BINDINGS_POLICY_WEB_UI) { | 253 if (host->GetEnabledBindings() & content::BINDINGS_POLICY_WEB_UI) { |
| 252 process.renderer_type = ProcessMemoryInformation::RENDERER_CHROME; | 254 process.renderer_type = ProcessMemoryInformation::RENDERER_CHROME; |
| 253 } else if (extension_process_map->Contains( | 255 } else if (extension_process_map != NULL && |
|
jam
2012/10/03 21:00:13
ditto (also below)
whywhat
2012/10/04 09:58:31
Done.
| |
| 254 host->GetProcess()->GetID())) { | 256 extension_process_map->Contains(host->GetProcess()->GetID())) { |
| 255 // For our purposes, don't count processes containing only hosted apps | 257 // For our purposes, don't count processes containing only hosted apps |
| 256 // as extension processes. See also: crbug.com/102533. | 258 // as extension processes. See also: crbug.com/102533. |
| 257 std::set<std::string> extension_ids = | 259 std::set<std::string> extension_ids = |
| 258 extension_process_map->GetExtensionsInProcess( | 260 extension_process_map->GetExtensionsInProcess( |
| 259 host->GetProcess()->GetID()); | 261 host->GetProcess()->GetID()); |
| 260 for (std::set<std::string>::iterator iter = extension_ids.begin(); | 262 for (std::set<std::string>::iterator iter = extension_ids.begin(); |
| 261 iter != extension_ids.end(); ++iter) { | 263 iter != extension_ids.end(); ++iter) { |
| 262 const Extension* extension = | 264 const Extension* extension = |
| 263 extension_service->GetExtensionById(*iter, false); | 265 extension_service->GetExtensionById(*iter, false); |
| 264 if (extension && !extension->is_hosted_app()) { | 266 if (extension && !extension->is_hosted_app()) { |
| 265 process.renderer_type = | 267 process.renderer_type = |
| 266 ProcessMemoryInformation::RENDERER_EXTENSION; | 268 ProcessMemoryInformation::RENDERER_EXTENSION; |
| 267 break; | 269 break; |
| 268 } | 270 } |
| 269 } | 271 } |
| 270 } | 272 } |
| 271 if (extension_process_map->Contains(host->GetProcess()->GetID())) { | 273 if (extension_process_map != NULL && |
| 274 extension_process_map->Contains(host->GetProcess()->GetID())) { | |
| 272 const Extension* extension = | 275 const Extension* extension = |
| 273 extension_service->extensions()->GetByID(url.host()); | 276 extension_service->extensions()->GetByID(url.host()); |
| 274 if (extension) { | 277 if (extension) { |
| 275 string16 title = UTF8ToUTF16(extension->name()); | 278 string16 title = UTF8ToUTF16(extension->name()); |
| 276 process.titles.push_back(title); | 279 process.titles.push_back(title); |
| 277 process.renderer_type = | 280 process.renderer_type = |
| 278 ProcessMemoryInformation::RENDERER_EXTENSION; | 281 ProcessMemoryInformation::RENDERER_EXTENSION; |
| 279 continue; | 282 continue; |
| 280 } | 283 } |
| 281 } | 284 } |
| (...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 458 UMA_HISTOGRAM_COUNTS_100("Memory.PepperPluginProcessCount", | 461 UMA_HISTOGRAM_COUNTS_100("Memory.PepperPluginProcessCount", |
| 459 pepper_plugin_count); | 462 pepper_plugin_count); |
| 460 UMA_HISTOGRAM_COUNTS_100("Memory.RendererProcessCount", renderer_count); | 463 UMA_HISTOGRAM_COUNTS_100("Memory.RendererProcessCount", renderer_count); |
| 461 UMA_HISTOGRAM_COUNTS_100("Memory.WorkerProcessCount", worker_count); | 464 UMA_HISTOGRAM_COUNTS_100("Memory.WorkerProcessCount", worker_count); |
| 462 // TODO(viettrungluu): Do we want separate counts for the other | 465 // TODO(viettrungluu): Do we want separate counts for the other |
| 463 // (platform-specific) process types? | 466 // (platform-specific) process types? |
| 464 | 467 |
| 465 int total_sample = static_cast<int>(aggregate_memory / 1000); | 468 int total_sample = static_cast<int>(aggregate_memory / 1000); |
| 466 UMA_HISTOGRAM_MEMORY_MB("Memory.Total", total_sample); | 469 UMA_HISTOGRAM_MEMORY_MB("Memory.Total", total_sample); |
| 467 } | 470 } |
| OLD | NEW |