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

Unified Diff: content/browser/child_process_launcher.cc

Issue 16267002: Re-fix http://crbug.com/87176, and add a test. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Second round of creis comments Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/child_process_launcher.cc
diff --git a/content/browser/child_process_launcher.cc b/content/browser/child_process_launcher.cc
index e497762aff8ebbd651e8467c6c0409ff7c8f8fe2..90b24253a2950a0a5745ee95d31dd7647c72aff4 100644
--- a/content/browser/child_process_launcher.cc
+++ b/content/browser/child_process_launcher.cc
@@ -43,11 +43,46 @@
namespace content {
+ChildProcessLauncher::~ChildProcessLauncher() {}
+
+class ChildProcessLauncherImpl : public ChildProcessLauncher {
+ public:
+ ChildProcessLauncherImpl(
+#if defined(OS_WIN)
+ SandboxedProcessLauncherDelegate* delegate,
+#elif defined(OS_POSIX)
+ bool use_zygote,
+ const base::EnvironmentVector& environ,
+ int ipcfd,
+#endif
+ CommandLine* cmd_line,
+ int child_process_id,
+ Client* client);
+
+ virtual ~ChildProcessLauncherImpl();
+
+ // ChildProcessLauncher implementation
+ virtual bool IsStarting() OVERRIDE;
+ virtual base::ProcessHandle GetHandle() OVERRIDE;
+ virtual base::TerminationStatus GetChildTerminationStatus(bool known_dead,
+ int* exit_code)
+ OVERRIDE;
+ virtual void SetProcessBackgrounded(bool background) OVERRIDE;
+ virtual void SetTerminateChildOnShutdown(bool terminate_on_shutdown) OVERRIDE;
+
+ private:
+ class Context;
+
+ scoped_refptr<Context> context_;
+
+ DISALLOW_COPY_AND_ASSIGN(ChildProcessLauncherImpl);
+};
+
// Having the functionality of ChildProcessLauncher be in an internal
// ref counted object allows us to automatically terminate the process when the
// parent class destructs, while still holding on to state that we need.
-class ChildProcessLauncher::Context
- : public base::RefCountedThreadSafe<ChildProcessLauncher::Context> {
+class ChildProcessLauncherImpl::Context
+ : public base::RefCountedThreadSafe<ChildProcessLauncherImpl::Context> {
public:
Context()
: client_(NULL),
@@ -124,10 +159,7 @@ class ChildProcessLauncher::Context
} else {
BrowserThread::PostTask(
client_thread_id, FROM_HERE,
- base::Bind(
- &ChildProcessLauncher::Context::Notify,
- this_object,
- handle));
+ base::Bind(&Context::Notify, this_object, handle));
}
}
#endif
@@ -144,8 +176,8 @@ class ChildProcessLauncher::Context
}
private:
- friend class base::RefCountedThreadSafe<ChildProcessLauncher::Context>;
- friend class ChildProcessLauncher;
+ friend class base::RefCountedThreadSafe<Context>;
+ friend class ChildProcessLauncherImpl;
~Context() {
Terminate();
@@ -158,7 +190,7 @@ class ChildProcessLauncher::Context
} else {
BrowserThread::PostTask(
BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
- base::Bind(&ChildProcessLauncher::Context::RecordLaunchHistograms,
+ base::Bind(&Context::RecordLaunchHistograms,
launch_time));
}
}
@@ -213,7 +245,7 @@ class ChildProcessLauncher::Context
&files_to_register);
StartChildProcess(cmd_line->argv(), files_to_register,
- base::Bind(&ChildProcessLauncher::Context::OnChildProcessStarted,
+ base::Bind(&Context::OnChildProcessStarted,
this_object, client_thread_id, begin_launch_time));
#elif defined(OS_POSIX)
@@ -409,7 +441,7 @@ class ChildProcessLauncher::Context
};
-ChildProcessLauncher::ChildProcessLauncher(
+ChildProcessLauncherImpl::ChildProcessLauncherImpl(
#if defined(OS_WIN)
SandboxedProcessLauncherDelegate* delegate,
#elif defined(OS_POSIX)
@@ -436,20 +468,20 @@ ChildProcessLauncher::ChildProcessLauncher(
client);
}
-ChildProcessLauncher::~ChildProcessLauncher() {
+ChildProcessLauncherImpl::~ChildProcessLauncherImpl() {
context_->ResetClient();
}
-bool ChildProcessLauncher::IsStarting() {
+bool ChildProcessLauncherImpl::IsStarting() {
return context_->starting_;
}
-base::ProcessHandle ChildProcessLauncher::GetHandle() {
+base::ProcessHandle ChildProcessLauncherImpl::GetHandle() {
DCHECK(!context_->starting_);
return context_->process_.handle();
}
-base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus(
+base::TerminationStatus ChildProcessLauncherImpl::GetChildTerminationStatus(
bool known_dead,
int* exit_code) {
base::ProcessHandle handle = context_->process_.handle();
@@ -485,18 +517,40 @@ base::TerminationStatus ChildProcessLauncher::GetChildTerminationStatus(
return context_->termination_status_;
}
-void ChildProcessLauncher::SetProcessBackgrounded(bool background) {
+void ChildProcessLauncherImpl::SetProcessBackgrounded(bool background) {
BrowserThread::PostTask(
BrowserThread::PROCESS_LAUNCHER, FROM_HERE,
- base::Bind(
- &ChildProcessLauncher::Context::SetProcessBackgrounded,
- GetHandle(), background));
+ base::Bind(&Context::SetProcessBackgrounded, GetHandle(), background));
}
-void ChildProcessLauncher::SetTerminateChildOnShutdown(
+void ChildProcessLauncherImpl::SetTerminateChildOnShutdown(
bool terminate_on_shutdown) {
if (context_.get())
context_->set_terminate_child_on_shutdown(terminate_on_shutdown);
}
+scoped_ptr<ChildProcessLauncher> NewChildProcessLauncher(
+#if defined(OS_WIN)
+ SandboxedProcessLauncherDelegate* delegate,
+#elif defined(OS_POSIX)
+ bool use_zygote,
+ const base::EnvironmentVector& environ,
+ int ipcfd,
+#endif
+ CommandLine* cmd_line,
+ int child_process_id,
+ ChildProcessLauncher::Client* client) {
+ return scoped_ptr<ChildProcessLauncher>(new ChildProcessLauncherImpl(
+#if defined(OS_WIN)
+ delegate,
+#elif defined(OS_POSIX)
+ use_zygote,
+ environ,
+ ipcfd,
+#endif
+ cmd_line,
+ child_process_id,
+ client));
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698