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

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

Issue 6992006: Terminate plugin processes on a delayed task to allow the plugins to shutdown gracefully, i.e. NP... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 9 years, 7 months 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/child_process_launcher.h" 5 #include "content/browser/child_process_launcher.h"
6 6
7 #include <utility> // For std::pair. 7 #include <utility> // For std::pair.
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 void LaunchInternal( 98 void LaunchInternal(
99 #if defined(OS_WIN) 99 #if defined(OS_WIN)
100 const FilePath& exposed_dir, 100 const FilePath& exposed_dir,
101 #elif defined(OS_POSIX) 101 #elif defined(OS_POSIX)
102 bool use_zygote, 102 bool use_zygote,
103 const base::environment_vector& env, 103 const base::environment_vector& env,
104 int ipcfd, 104 int ipcfd,
105 #endif 105 #endif
106 CommandLine* cmd_line) { 106 CommandLine* cmd_line) {
107 scoped_ptr<CommandLine> cmd_line_deleter(cmd_line); 107 scoped_ptr<CommandLine> cmd_line_deleter(cmd_line);
108 process_type_ = cmd_line->GetSwitchValueASCII(switches::kProcessType);
108 base::ProcessHandle handle = base::kNullProcessHandle; 109 base::ProcessHandle handle = base::kNullProcessHandle;
109 #if defined(OS_WIN) 110 #if defined(OS_WIN)
110 handle = sandbox::StartProcessWithAccess(cmd_line, exposed_dir); 111 handle = sandbox::StartProcessWithAccess(cmd_line, exposed_dir);
111 #elif defined(OS_POSIX) 112 #elif defined(OS_POSIX)
112 113
113 #if defined(OS_LINUX) 114 #if defined(OS_LINUX)
114 // On Linux, we need to add some extra file descriptors for crash handling. 115 // On Linux, we need to add some extra file descriptors for crash handling.
115 std::string process_type = 116 std::string process_type =
116 cmd_line->GetSwitchValueASCII(switches::kProcessType); 117 cmd_line->GetSwitchValueASCII(switches::kProcessType);
117 int crash_signal_fd = 118 int crash_signal_fd =
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 client_->OnProcessLaunched(); 204 client_->OnProcessLaunched();
204 } else { 205 } else {
205 Terminate(); 206 Terminate();
206 } 207 }
207 } 208 }
208 209
209 void Terminate() { 210 void Terminate() {
210 if (!process_.handle()) 211 if (!process_.handle())
211 return; 212 return;
212 213
214 const int kPluginProcessTerminateTimeoutMs = 2000;
215
213 // On Posix, EnsureProcessTerminated can lead to 2 seconds of sleep! So 216 // On Posix, EnsureProcessTerminated can lead to 2 seconds of sleep! So
214 // don't this on the UI/IO threads. 217 // don't this on the UI/IO threads.
215 BrowserThread::PostTask( 218 // Allow plugins to shutdown gracefully before terminating the process.
216 BrowserThread::PROCESS_LAUNCHER, FROM_HERE, 219 if (process_type_ == switches::kPluginProcess) {
jam 2011/05/23 22:32:59 ChildProcessLauncher is the base class that's used
217 NewRunnableFunction( 220 BrowserThread::PostDelayedTask(
218 &ChildProcessLauncher::Context::TerminateInternal, 221 BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
219 #if defined(OS_LINUX) 222 NewRunnableFunction(
220 zygote_, 223 &ChildProcessLauncher::Context::TerminateInternal,
221 #endif 224 #if defined(OS_LINUX)
222 process_.handle())); 225 zygote_,
226 #endif
227 process_.handle()), kPluginProcessTerminateTimeoutMs);
228 } else {
229 BrowserThread::PostTask(
230 BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
231 NewRunnableFunction(
232 &ChildProcessLauncher::Context::TerminateInternal,
233 #if defined(OS_LINUX)
234 zygote_,
235 #endif
236 process_.handle()));
237 }
223 process_.set_handle(base::kNullProcessHandle); 238 process_.set_handle(base::kNullProcessHandle);
224 } 239 }
225 240
226 void SetProcessBackgrounded(bool background) { 241 void SetProcessBackgrounded(bool background) {
227 DCHECK(!starting_); 242 DCHECK(!starting_);
228 process_.SetProcessBackgrounded(background); 243 process_.SetProcessBackgrounded(background);
229 } 244 }
230 245
231 static void TerminateInternal( 246 static void TerminateInternal(
232 #if defined(OS_LINUX) 247 #if defined(OS_LINUX)
(...skipping 17 matching lines...) Expand all
250 ProcessWatcher::EnsureProcessTerminated(handle); 265 ProcessWatcher::EnsureProcessTerminated(handle);
251 } 266 }
252 #endif // OS_POSIX 267 #endif // OS_POSIX
253 process.Close(); 268 process.Close();
254 } 269 }
255 270
256 Client* client_; 271 Client* client_;
257 BrowserThread::ID client_thread_id_; 272 BrowserThread::ID client_thread_id_;
258 base::Process process_; 273 base::Process process_;
259 bool starting_; 274 bool starting_;
275 std::string process_type_;
260 276
261 #if defined(OS_LINUX) 277 #if defined(OS_LINUX)
262 bool zygote_; 278 bool zygote_;
263 #endif 279 #endif
264 }; 280 };
265 281
266 282
267 ChildProcessLauncher::ChildProcessLauncher( 283 ChildProcessLauncher::ChildProcessLauncher(
268 #if defined(OS_WIN) 284 #if defined(OS_WIN)
269 const FilePath& exposed_dir, 285 const FilePath& exposed_dir,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 } 342 }
327 343
328 void ChildProcessLauncher::SetProcessBackgrounded(bool background) { 344 void ChildProcessLauncher::SetProcessBackgrounded(bool background) {
329 BrowserThread::PostTask( 345 BrowserThread::PostTask(
330 BrowserThread::PROCESS_LAUNCHER, FROM_HERE, 346 BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
331 NewRunnableMethod( 347 NewRunnableMethod(
332 context_.get(), 348 context_.get(),
333 &ChildProcessLauncher::Context::SetProcessBackgrounded, 349 &ChildProcessLauncher::Context::SetProcessBackgrounded,
334 background)); 350 background));
335 } 351 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698