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 "chrome/test/base/chrome_process_util.h" | 5 #include "chrome/test/base/chrome_process_util.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
12 #include "base/process/process.h" | 12 #include "base/process/process.h" |
13 #include "base/process/process_iterator.h" | 13 #include "base/process/process_iterator.h" |
14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
15 #include "chrome/common/chrome_constants.h" | 15 #include "chrome/common/chrome_constants.h" |
16 #include "chrome/test/base/test_switches.h" | 16 #include "chrome/test/base/test_switches.h" |
17 #include "content/public/common/result_codes.h" | 17 #include "content/public/common/result_codes.h" |
18 | 18 |
19 using base::TimeDelta; | 19 using base::TimeDelta; |
20 using base::TimeTicks; | 20 using base::TimeTicks; |
21 | 21 |
22 namespace { | |
23 | |
24 #if defined(OS_POSIX) | |
25 // Returns the executable name of the current Chrome helper process. | |
26 std::vector<base::FilePath::StringType> GetRunningHelperExecutableNames() { | |
27 base::FilePath::StringType name = chrome::kHelperProcessExecutableName; | |
28 | |
29 std::vector<base::FilePath::StringType> names; | |
30 names.push_back(name); | |
31 | |
32 #if defined(OS_MACOSX) | |
33 // The helper might show up as these different flavors depending on the | |
34 // executable flags required. | |
35 for (const char* const* suffix = chrome::kHelperFlavorSuffixes; | |
36 *suffix; | |
37 ++suffix) { | |
38 std::string flavor_name(name); | |
39 flavor_name.append(1, ' '); | |
40 flavor_name.append(*suffix); | |
41 names.push_back(flavor_name); | |
42 } | |
43 #endif | |
44 | |
45 return names; | |
46 } | |
47 #endif // defined(OS_POSIX) | |
48 | |
49 } // namespace | |
50 | |
51 void TerminateAllChromeProcesses(const ChromeProcessList& process_pids) { | 22 void TerminateAllChromeProcesses(const ChromeProcessList& process_pids) { |
52 ChromeProcessList::const_iterator it; | 23 ChromeProcessList::const_iterator it; |
53 for (it = process_pids.begin(); it != process_pids.end(); ++it) { | 24 for (it = process_pids.begin(); it != process_pids.end(); ++it) { |
54 base::Process process = base::Process::Open(*it); | 25 base::Process process = base::Process::Open(*it); |
55 if (process.IsValid()) { | 26 if (process.IsValid()) { |
56 // Ignore processes for which we can't open the handle. We don't | 27 // Ignore processes for which we can't open the handle. We don't |
57 // guarantee that all processes will terminate, only try to do so. | 28 // guarantee that all processes will terminate, only try to do so. |
58 process.Terminate(content::RESULT_CODE_KILLED, true); | 29 process.Terminate(content::RESULT_CODE_KILLED, true); |
59 } | 30 } |
60 } | 31 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 while (const base::ProcessEntry* process_entry = it.NextProcessEntry()) | 72 while (const base::ProcessEntry* process_entry = it.NextProcessEntry()) |
102 result.push_back(process_entry->pid()); | 73 result.push_back(process_entry->pid()); |
103 } | 74 } |
104 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) | 75 #endif // defined(OS_POSIX) && !defined(OS_MACOSX) |
105 | 76 |
106 #if defined(OS_POSIX) | 77 #if defined(OS_POSIX) |
107 // On Mac OS X we run the subprocesses with a different bundle, and | 78 // On Mac OS X we run the subprocesses with a different bundle, and |
108 // on Linux via /proc/self/exe, so they end up with a different | 79 // on Linux via /proc/self/exe, so they end up with a different |
109 // name. We must collect them in a second pass. | 80 // name. We must collect them in a second pass. |
110 { | 81 { |
111 std::vector<base::FilePath::StringType> names = | 82 base::FilePath::StringType name = chrome::kHelperProcessExecutableName; |
112 GetRunningHelperExecutableNames(); | 83 ChildProcessFilter filter(browser_pid); |
113 for (size_t i = 0; i < names.size(); ++i) { | 84 base::NamedProcessIterator it(name, &filter); |
114 base::FilePath::StringType name = names[i]; | 85 while (const base::ProcessEntry* process_entry = it.NextProcessEntry()) |
115 ChildProcessFilter filter(browser_pid); | 86 result.push_back(process_entry->pid()); |
116 base::NamedProcessIterator it(name, &filter); | |
117 while (const base::ProcessEntry* process_entry = it.NextProcessEntry()) | |
118 result.push_back(process_entry->pid()); | |
119 } | |
120 } | 87 } |
121 #endif // defined(OS_POSIX) | 88 #endif // defined(OS_POSIX) |
122 | 89 |
123 result.push_back(browser_pid); | 90 result.push_back(browser_pid); |
124 | 91 |
125 return result; | 92 return result; |
126 } | 93 } |
127 | 94 |
128 #if !defined(OS_MACOSX) | 95 #if !defined(OS_MACOSX) |
129 | 96 |
(...skipping 13 matching lines...) Expand all Loading... |
143 base::ProcessHandle process) { | 110 base::ProcessHandle process) { |
144 #if !defined(OS_MACOSX) | 111 #if !defined(OS_MACOSX) |
145 process_metrics_.reset( | 112 process_metrics_.reset( |
146 base::ProcessMetrics::CreateProcessMetrics(process)); | 113 base::ProcessMetrics::CreateProcessMetrics(process)); |
147 #else | 114 #else |
148 process_metrics_.reset( | 115 process_metrics_.reset( |
149 base::ProcessMetrics::CreateProcessMetrics(process, NULL)); | 116 base::ProcessMetrics::CreateProcessMetrics(process, NULL)); |
150 #endif | 117 #endif |
151 process_handle_ = process; | 118 process_handle_ = process; |
152 } | 119 } |
OLD | NEW |