blob: 08c82e140f8ddacb1e8584bd5cfb9d3a3faf217c [file] [log] [blame]
[email protected]b0b67cf2012-01-18 21:59:571// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]f164cea2009-11-05 23:37:402// 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
avi6846aef2015-12-26 01:09:387#include <stddef.h>
8
dcheng4af48582016-04-19 00:29:359#include <memory>
[email protected]f164cea2009-11-05 23:37:4010#include <set>
11#include <string>
12
[email protected]24d69692011-10-21 18:26:5113#include "base/bind.h"
[email protected]f164cea2009-11-05 23:37:4014#include "base/file_version_info.h"
[email protected]57999812013-02-24 05:40:5215#include "base/files/file_path.h"
avi69fed022014-12-21 01:02:5216#include "base/mac/foundation_util.h"
[email protected]d09a4ce1c2013-07-24 17:37:0217#include "base/process/process_iterator.h"
[email protected]f9b294362013-06-10 20:22:3118#include "base/strings/string_util.h"
[email protected]112158af2013-06-07 23:46:1819#include "base/strings/utf_string_conversions.h"
Etienne Pierre-doray0fbce432018-08-27 20:27:5120#include "base/threading/scoped_blocking_call.h"
[email protected]34b99632011-01-01 01:01:0621#include "base/threading/thread.h"
[email protected]f164cea2009-11-05 23:37:4022#include "chrome/common/chrome_constants.h"
23#include "chrome/common/url_constants.h"
[email protected]af39f002014-08-22 10:18:1824#include "chrome/grit/chromium_strings.h"
sdefresne9fb67692015-08-03 18:48:2225#include "components/version_info/version_info.h"
asvitkine58409e4c2015-01-15 01:25:4526#include "content/public/browser/browser_child_process_host.h"
[email protected]c38831a12011-10-28 12:44:4927#include "content/public/browser/browser_thread.h"
[email protected]bd5d6cf2011-12-01 00:39:1228#include "content/public/common/process_type.h"
[email protected]c051a1b2011-01-21 23:30:1729#include "ui/base/l10n/l10n_util.h"
[email protected]f164cea2009-11-05 23:37:4030
[email protected]631bb742011-11-02 11:29:3931using content::BrowserThread;
32
asvitkine6f5f3592015-01-21 20:50:3733namespace {
34
35// A helper for |CollectProcessData()|, collecting data on the Chrome/Chromium
36// process with PID |pid|. The collected data is added to |processes|.
37void CollectProcessDataForChromeProcess(
38 const std::vector<ProcessMemoryInformation>& child_info,
39 base::ProcessId pid,
40 ProcessMemoryInformationList* processes) {
41 ProcessMemoryInformation info;
42 info.pid = pid;
43 if (info.pid == base::GetCurrentProcId())
44 info.process_type = content::PROCESS_TYPE_BROWSER;
45 else
46 info.process_type = content::PROCESS_TYPE_UNKNOWN;
47
sdefresne9fb67692015-08-03 18:48:2248 info.product_name = base::ASCIIToUTF16(version_info::GetProductName());
49 info.version = base::ASCIIToUTF16(version_info::GetVersionNumber());
asvitkine6f5f3592015-01-21 20:50:3750
51 // Check if this is one of the child processes whose data was already
52 // collected and exists in |child_data|.
53 for (const ProcessMemoryInformation& child : child_info) {
54 if (child.pid == info.pid) {
55 info.titles = child.titles;
56 info.process_type = child.process_type;
57 break;
58 }
59 }
60
asvitkine6f5f3592015-01-21 20:50:3761 processes->push_back(info);
62}
63
asvitkine6f5f3592015-01-21 20:50:3764} // namespace
[email protected]f164cea2009-11-05 23:37:4065
asvitkine89406d1f2015-01-17 06:57:1066MemoryDetails::MemoryDetails() {
asvitkine58409e4c2015-01-15 01:25:4567 const base::FilePath browser_process_path =
68 base::GetProcessExecutablePath(base::GetCurrentProcessHandle());
asvitkine58409e4c2015-01-15 01:25:4569
ellyjonescd6e449d2016-04-13 19:31:1570 ProcessData process;
71 process.name = l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
72 process.process_name =
73 base::UTF8ToUTF16(browser_process_path.BaseName().value());
74 process_data_.push_back(process);
[email protected]f164cea2009-11-05 23:37:4075}
76
77ProcessData* MemoryDetails::ChromeBrowser() {
ellyjonescd6e449d2016-04-13 19:31:1578 return &process_data_[0];
[email protected]f164cea2009-11-05 23:37:4079}
80
81void MemoryDetails::CollectProcessData(
[email protected]4df3ac62011-03-11 04:38:5282 const std::vector<ProcessMemoryInformation>& child_info) {
Etienne Pierre-doray0fbce432018-08-27 20:27:5183 base::ScopedBlockingCall scoped_blocking_call(base::BlockingType::MAY_BLOCK);
[email protected]f164cea2009-11-05 23:37:4084
85 // Clear old data.
ellyjonescd6e449d2016-04-13 19:31:1586 process_data_[0].processes.clear();
[email protected]f164cea2009-11-05 23:37:4087
88 // First, we use |NamedProcessIterator| to get the PIDs of the processes we're
89 // interested in; we save our results to avoid extra calls to
90 // |NamedProcessIterator| (for performance reasons) and to avoid additional
91 // inconsistencies caused by racing. Then we run |/bin/ps| *once* to get
92 // information on those PIDs. Then we used our saved information to iterate
93 // over browsers, then over PIDs.
94
95 // Get PIDs of main browser processes.
[email protected]f164cea2009-11-05 23:37:4096 std::vector<base::ProcessId> all_pids;
ellyjonescd6e449d2016-04-13 19:31:1597 {
[email protected]4f260d02010-12-23 18:35:4298 base::NamedProcessIterator process_it(
ellyjonescd6e449d2016-04-13 19:31:1599 base::UTF16ToUTF8(process_data_[0].process_name), NULL);
[email protected]f164cea2009-11-05 23:37:40100
[email protected]a5a00b1d2010-04-08 15:52:45101 while (const base::ProcessEntry* entry = process_it.NextProcessEntry()) {
[email protected]b6128aa2010-04-29 17:44:42102 all_pids.push_back(entry->pid());
[email protected]f164cea2009-11-05 23:37:40103 }
104 }
105
kerrnel0c619642015-09-21 18:39:54106 // Get PIDs of the helper.
ellyjonescd6e449d2016-04-13 19:31:15107 {
108 base::NamedProcessIterator helper_it(chrome::kHelperProcessExecutableName,
109 NULL);
110 while (const base::ProcessEntry* entry = helper_it.NextProcessEntry()) {
111 all_pids.push_back(entry->pid());
112 }
[email protected]f164cea2009-11-05 23:37:40113 }
114
ellyjonescd6e449d2016-04-13 19:31:15115 ProcessMemoryInformationList* chrome_processes = &process_data_[0].processes;
asvitkine6f5f3592015-01-21 20:50:37116
[email protected]f164cea2009-11-05 23:37:40117 // Collect data about Chrome/Chromium.
ellyjonescd6e449d2016-04-13 19:31:15118 for (const base::ProcessId& pid : all_pids)
asvitkine6f5f3592015-01-21 20:50:37119 CollectProcessDataForChromeProcess(child_info, pid, chrome_processes);
[email protected]f164cea2009-11-05 23:37:40120
121 // Finally return to the browser thread.
[email protected]f8b3ef82010-10-11 02:45:52122 BrowserThread::PostTask(
123 BrowserThread::UI, FROM_HERE,
[email protected]24d69692011-10-21 18:26:51124 base::Bind(&MemoryDetails::CollectChildInfoOnUIThread, this));
[email protected]f164cea2009-11-05 23:37:40125}