Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(495)

Side by Side Diff: content/browser/browser_child_process_host.cc

Issue 8760011: Move the ProcessType enum out to its own file. This is in preparation for getting rid of ChildPro... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: fix mac Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/browser_child_process_host.h" 5 #include "content/browser/browser_child_process_host.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/file_path.h" 8 #include "base/file_path.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 } 53 }
54 54
55 private: 55 private:
56 int notification_type_; 56 int notification_type_;
57 ChildProcessInfo info_; 57 ChildProcessInfo info_;
58 }; 58 };
59 59
60 } // namespace 60 } // namespace
61 61
62 BrowserChildProcessHost::BrowserChildProcessHost( 62 BrowserChildProcessHost::BrowserChildProcessHost(
63 ChildProcessInfo::ProcessType type) 63 content::ProcessType type)
64 : ChildProcessInfo(type, -1), 64 : ChildProcessInfo(type, -1),
65 ALLOW_THIS_IN_INITIALIZER_LIST(client_(this)), 65 ALLOW_THIS_IN_INITIALIZER_LIST(client_(this)),
66 #if !defined(OS_WIN) 66 #if !defined(OS_WIN)
67 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)), 67 ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)),
68 #endif 68 #endif
69 disconnect_was_alive_(false) { 69 disconnect_was_alive_(false) {
70 AddFilter(new TraceMessageFilter); 70 AddFilter(new TraceMessageFilter);
71 71
72 g_child_process_list.Get().push_back(this); 72 g_child_process_list.Get().push_back(this);
73 } 73 }
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 DCHECK(handle() != base::kNullProcessHandle); 150 DCHECK(handle() != base::kNullProcessHandle);
151 int exit_code; 151 int exit_code;
152 base::TerminationStatus status = GetChildTerminationStatus(&exit_code); 152 base::TerminationStatus status = GetChildTerminationStatus(&exit_code);
153 switch (status) { 153 switch (status) {
154 case base::TERMINATION_STATUS_PROCESS_CRASHED: 154 case base::TERMINATION_STATUS_PROCESS_CRASHED:
155 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: { 155 case base::TERMINATION_STATUS_ABNORMAL_TERMINATION: {
156 OnProcessCrashed(exit_code); 156 OnProcessCrashed(exit_code);
157 // Report that this child process crashed. 157 // Report that this child process crashed.
158 Notify(content::NOTIFICATION_CHILD_PROCESS_CRASHED); 158 Notify(content::NOTIFICATION_CHILD_PROCESS_CRASHED);
159 UMA_HISTOGRAM_ENUMERATION("ChildProcess.Crashed", 159 UMA_HISTOGRAM_ENUMERATION("ChildProcess.Crashed",
160 this->type(), MAX_PROCESS); 160 this->type(),
161 content::PROCESS_TYPE_MAX);
161 if (disconnect_was_alive_) { 162 if (disconnect_was_alive_) {
162 UMA_HISTOGRAM_ENUMERATION("ChildProcess.CrashedWasAlive", 163 UMA_HISTOGRAM_ENUMERATION("ChildProcess.CrashedWasAlive",
163 this->type(), MAX_PROCESS); 164 this->type(),
165 content::PROCESS_TYPE_MAX);
164 } 166 }
165 break; 167 break;
166 } 168 }
167 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: { 169 case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: {
168 OnProcessWasKilled(exit_code); 170 OnProcessWasKilled(exit_code);
169 // Report that this child process was killed. 171 // Report that this child process was killed.
170 Notify(content::NOTIFICATION_CHILD_PROCESS_WAS_KILLED); 172 Notify(content::NOTIFICATION_CHILD_PROCESS_WAS_KILLED);
171 UMA_HISTOGRAM_ENUMERATION("ChildProcess.Killed", 173 UMA_HISTOGRAM_ENUMERATION("ChildProcess.Killed",
172 this->type(), MAX_PROCESS); 174 this->type(),
175 content::PROCESS_TYPE_MAX);
173 if (disconnect_was_alive_) { 176 if (disconnect_was_alive_) {
174 UMA_HISTOGRAM_ENUMERATION("ChildProcess.KilledWasAlive", 177 UMA_HISTOGRAM_ENUMERATION("ChildProcess.KilledWasAlive",
175 this->type(), MAX_PROCESS); 178 this->type(),
179 content::PROCESS_TYPE_MAX);
176 } 180 }
177 break; 181 break;
178 } 182 }
179 case base::TERMINATION_STATUS_STILL_RUNNING: { 183 case base::TERMINATION_STATUS_STILL_RUNNING: {
180 // Exit code not yet available. Ensure we don't wait forever for an exit 184 // Exit code not yet available. Ensure we don't wait forever for an exit
181 // code. 185 // code.
182 if (disconnect_was_alive_) { 186 if (disconnect_was_alive_) {
183 UMA_HISTOGRAM_ENUMERATION("ChildProcess.DisconnectedAlive", 187 UMA_HISTOGRAM_ENUMERATION("ChildProcess.DisconnectedAlive",
184 this->type(), MAX_PROCESS); 188 this->type(),
189 content::PROCESS_TYPE_MAX);
185 break; 190 break;
186 } 191 }
187 disconnect_was_alive_ = true; 192 disconnect_was_alive_ = true;
188 #if defined(OS_WIN) 193 #if defined(OS_WIN)
189 child_watcher_.StartWatching(new base::WaitableEvent(handle()), this); 194 child_watcher_.StartWatching(new base::WaitableEvent(handle()), this);
190 #else 195 #else
191 // On non-Windows platforms, give the child process some time to die after 196 // On non-Windows platforms, give the child process some time to die after
192 // disconnecting the channel so that the exit code and termination status 197 // disconnecting the channel so that the exit code and termination status
193 // become available. This is best effort -- if the process doesn't die 198 // become available. This is best effort -- if the process doesn't die
194 // within the time limit, this object gets destroyed. 199 // within the time limit, this object gets destroyed.
195 const int kExitCodeWaitMs = 250; 200 const int kExitCodeWaitMs = 250;
196 MessageLoop::current()->PostDelayedTask( 201 MessageLoop::current()->PostDelayedTask(
197 FROM_HERE, 202 FROM_HERE,
198 base::Bind(&BrowserChildProcessHost::OnChildDisconnected, 203 base::Bind(&BrowserChildProcessHost::OnChildDisconnected,
199 task_factory_.GetWeakPtr()), 204 task_factory_.GetWeakPtr()),
200 kExitCodeWaitMs); 205 kExitCodeWaitMs);
201 #endif 206 #endif
202 return; 207 return;
203 } 208 }
204 209
205 default: 210 default:
206 break; 211 break;
207 } 212 }
208 UMA_HISTOGRAM_ENUMERATION("ChildProcess.Disconnected", 213 UMA_HISTOGRAM_ENUMERATION("ChildProcess.Disconnected",
209 this->type(), MAX_PROCESS); 214 this->type(),
215 content::PROCESS_TYPE_MAX);
210 // Notify in the main loop of the disconnection. 216 // Notify in the main loop of the disconnection.
211 Notify(content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED); 217 Notify(content::NOTIFICATION_CHILD_PROCESS_HOST_DISCONNECTED);
212 OnChildDied(); 218 OnChildDied();
213 } 219 }
214 220
215 // The child process handle has been signaled so the exit code is finally 221 // The child process handle has been signaled so the exit code is finally
216 // available. Unfortunately STILL_ACTIVE (0x103) is a valid exit code in 222 // available. Unfortunately STILL_ACTIVE (0x103) is a valid exit code in
217 // which case we should not call OnChildDisconnected() or else we will be 223 // which case we should not call OnChildDisconnected() or else we will be
218 // waiting forever. 224 // waiting forever.
219 void BrowserChildProcessHost::OnWaitableEventSignaled( 225 void BrowserChildProcessHost::OnWaitableEventSignaled(
(...skipping 21 matching lines...) Expand all
241 void BrowserChildProcessHost::ClientHook::OnProcessLaunched() { 247 void BrowserChildProcessHost::ClientHook::OnProcessLaunched() {
242 if (!host_->child_process_->GetHandle()) { 248 if (!host_->child_process_->GetHandle()) {
243 host_->OnChildDied(); 249 host_->OnChildDied();
244 return; 250 return;
245 } 251 }
246 host_->set_handle(host_->child_process_->GetHandle()); 252 host_->set_handle(host_->child_process_->GetHandle());
247 host_->OnProcessLaunched(); 253 host_->OnProcessLaunched();
248 } 254 }
249 255
250 BrowserChildProcessHost::Iterator::Iterator() 256 BrowserChildProcessHost::Iterator::Iterator()
251 : all_(true), type_(UNKNOWN_PROCESS) { 257 : all_(true), type_(content::PROCESS_TYPE_UNKNOWN) {
252 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) << 258 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) <<
253 "ChildProcessInfo::Iterator must be used on the IO thread."; 259 "ChildProcessInfo::Iterator must be used on the IO thread.";
254 iterator_ = g_child_process_list.Get().begin(); 260 iterator_ = g_child_process_list.Get().begin();
255 } 261 }
256 262
257 BrowserChildProcessHost::Iterator::Iterator(ChildProcessInfo::ProcessType type) 263 BrowserChildProcessHost::Iterator::Iterator(content::ProcessType type)
258 : all_(false), type_(type) { 264 : all_(false), type_(type) {
259 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) << 265 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)) <<
260 "ChildProcessInfo::Iterator must be used on the IO thread."; 266 "ChildProcessInfo::Iterator must be used on the IO thread.";
261 iterator_ = g_child_process_list.Get().begin(); 267 iterator_ = g_child_process_list.Get().begin();
262 if (!Done() && (*iterator_)->type() != type_) 268 if (!Done() && (*iterator_)->type() != type_)
263 ++(*this); 269 ++(*this);
264 } 270 }
265 271
266 BrowserChildProcessHost* BrowserChildProcessHost::Iterator::operator++() { 272 BrowserChildProcessHost* BrowserChildProcessHost::Iterator::operator++() {
267 do { 273 do {
268 ++iterator_; 274 ++iterator_;
269 if (Done()) 275 if (Done())
270 break; 276 break;
271 277
272 if (!all_ && (*iterator_)->type() != type_) 278 if (!all_ && (*iterator_)->type() != type_)
273 continue; 279 continue;
274 280
275 return *iterator_; 281 return *iterator_;
276 } while (true); 282 } while (true);
277 283
278 return NULL; 284 return NULL;
279 } 285 }
280 286
281 bool BrowserChildProcessHost::Iterator::Done() { 287 bool BrowserChildProcessHost::Iterator::Done() {
282 return iterator_ == g_child_process_list.Get().end(); 288 return iterator_ == g_child_process_list.Get().end();
283 } 289 }
OLDNEW
« no previous file with comments | « content/browser/browser_child_process_host.h ('k') | content/browser/debugger/worker_devtools_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698