OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/memory_details.h" | |
6 | |
7 #include "app/l10n_util.h" | |
8 #include "base/file_version_info.h" | |
9 #include "base/string_util.h" | |
10 #include "chrome/browser/browser_process.h" | |
11 #include "chrome/browser/chrome_thread.h" | |
12 #include "chrome/common/child_process_host.h" | |
13 #include "chrome/common/url_constants.h" | |
14 #include "grit/chromium_strings.h" | |
15 | |
16 // Known browsers which we collect details for. | |
17 enum _BrowserProcess { | |
18 CHROME_BROWSER = 0, | |
19 FIREFOX_BROWSER, | |
20 OPERA_BROWSER, | |
21 KONQUEROR_BROWSER, | |
22 MAX_BROWSERS | |
23 } BrowserProcess; | |
24 | |
25 // Template of static data we use for finding browser process information. | |
26 // These entries must match the ordering for MemoryDetails::BrowserProcess. | |
27 static ProcessData g_process_template[MAX_BROWSERS]; | |
28 | |
29 MemoryDetails::MemoryDetails() | |
30 : ui_loop_(NULL) { | |
31 static const std::wstring google_browser_name = | |
32 l10n_util::GetString(IDS_PRODUCT_NAME); | |
Evan Martin
2009/08/03 05:16:11
We avoid statics as a rule; is there a reason for
| |
33 ProcessData g_process_template[MAX_BROWSERS] = { | |
Evan Martin
2009/08/03 05:16:11
Does this shadow the other definition? I am confu
| |
34 { google_browser_name.c_str(), L"chrome", }, | |
35 { L"Firefox", L"firefox-bin", }, | |
Joel Stanley (old)
2009/08/03 16:02:37
Some other browsers present on my Ubuntu Karmic sy
| |
36 { L"Opera", L"opera", }, | |
37 { L"Konqueror", L"konqueror", }, | |
38 }; | |
39 | |
40 for (unsigned int index = 0; index < arraysize(g_process_template); ++index) { | |
Evan Martin
2009/08/03 05:16:11
size_t
| |
41 ProcessData process; | |
42 process.name = g_process_template[index].name; | |
43 process.process_name = g_process_template[index].process_name; | |
44 process_data_.push_back(process); | |
45 } | |
46 } | |
47 | |
48 ProcessData* MemoryDetails::ChromeBrowser() { | |
49 return &process_data_[CHROME_BROWSER]; | |
50 } | |
51 | |
52 void MemoryDetails::CollectProcessData( | |
53 std::vector<ProcessMemoryInformation> child_info) { | |
54 DCHECK(MessageLoop::current() == | |
55 ChromeThread::GetMessageLoop(ChromeThread::FILE)); | |
56 | |
57 for (unsigned int index = 0; index < arraysize(g_process_template); index++) { | |
Evan Martin
2009/08/03 05:16:11
size_t
| |
58 process_data_[index].processes.clear(); | |
59 | |
60 base::NamedProcessIterator process_iter(process_data_[index].process_name, | |
61 NULL); | |
62 | |
63 const ProcessEntry* entry; | |
64 while ((entry = process_iter.NextProcessEntry())) { | |
65 ProcessMemoryInformation info; | |
66 info.pid = entry->pid; | |
67 | |
68 if (info.pid == base::GetCurrentProcId()) | |
69 info.type = ChildProcessInfo::BROWSER_PROCESS; | |
70 else | |
71 info.type = ChildProcessInfo::UNKNOWN_PROCESS; | |
72 | |
73 base::ProcessHandle handle; | |
74 if (!base::OpenProcessHandle(entry->pid, &handle)) | |
75 continue; | |
76 scoped_ptr<base::ProcessMetrics> metrics; | |
77 metrics.reset(base::ProcessMetrics::CreateProcessMetrics(handle)); | |
78 metrics->GetCommittedKBytes(&info.committed); | |
79 metrics->GetWorkingSetKBytes(&info.working_set); | |
80 | |
81 // Get Version Information. | |
82 if (index == CHROME_BROWSER) { | |
83 scoped_ptr<FileVersionInfo> version_info( | |
84 FileVersionInfo::CreateFileVersionInfoForCurrentModule()); | |
85 if (version_info != NULL) | |
86 info.version = version_info->file_version(); | |
87 // Check if this is one of the child processes whose data we collected | |
88 // on the IO thread, and if so copy over that data. | |
89 for (size_t child = 0; child < child_info.size(); child++) { | |
90 if (child_info[child].pid != info.pid) | |
91 continue; | |
92 info.titles = child_info[child].titles; | |
93 info.type = child_info[child].type; | |
94 break; | |
95 } | |
96 } | |
97 | |
98 // Add the process info to our list. | |
99 process_data_[index].processes.push_back(info); | |
100 } | |
101 } | |
102 | |
103 // Finally return to the browser thread. | |
104 ui_loop_->PostTask(FROM_HERE, | |
105 NewRunnableMethod(this, &MemoryDetails::CollectChildInfoOnUIThread)); | |
106 } | |
OLD | NEW |