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

Unified Diff: content/common/child_thread.cc

Issue 10855013: Ensure we don't have zombie child processes that get started but never get a chance to connect to t… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 4 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
« no previous file with comments | « content/common/child_thread.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/child_thread.cc
===================================================================
--- content/common/child_thread.cc (revision 150143)
+++ content/common/child_thread.cc (working copy)
@@ -8,6 +8,7 @@
#include "base/command_line.h"
#include "base/message_loop.h"
#include "base/process.h"
+#include "base/process_util.h"
#include "base/string_util.h"
#include "base/tracked_objects.h"
#include "content/common/child_histogram_message_filter.h"
@@ -34,8 +35,17 @@
namespace {
+// How long to wait for a connection to the browser process before giving up.
+const int kConnectionTimeoutS = 15;
+
+// This isn't needed on Windows because there the sandbox's job objects
+// terminates child processes automatically. For unsanboxed processes (i.e.
Avi (use Gerrit) 2012/08/07 04:50:51 s/terminates/terminate/ to match quantity. s/unsan
jam 2012/08/07 04:54:28 updated objects to object since there's only one
+// plugins), PluginThread has EnsureTerminateMessageFilter.
#if defined(OS_POSIX)
+// How long to wait after the browser process goes away to kill ourselves.
+const int kSuicideTimeoutS = 5;
+
class SuicideOnChannelErrorFilter : public IPC::ChannelProxy::MessageFilter {
public:
// IPC::ChannelProxy::MessageFilter
@@ -59,29 +69,40 @@
// We want to kill this process after giving it 30 seconds to run the exit
// handlers. SIGALRM has a default disposition of terminating the
// application.
- LOG(INFO) << "SuicideOnChannelErrorFilter::OnChannelError";
- if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kChildCleanExit))
+ if (CommandLine::ForCurrentProcess()->HasSwitch(
+ switches::kChildCleanExit)) {
alarm(30);
- else
- _exit(0);
+ } else {
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&SuicideOnChannelErrorFilter::Exit, this),
+ base::TimeDelta::FromSeconds(kSuicideTimeoutS));
Avi (use Gerrit) 2012/08/07 04:50:51 This change from immediate exit to delayed suicide
jam 2012/08/07 04:54:28 On second thoughts, I'll remove that from this cha
+ }
}
protected:
virtual ~SuicideOnChannelErrorFilter() {}
+
+ private:
+ void Exit() {
+ _exit(0);
+ }
};
#endif // OS(POSIX)
} // namespace
-ChildThread::ChildThread() {
+ChildThread::ChildThread()
+ : ALLOW_THIS_IN_INITIALIZER_LIST(channel_connected_factory_(this)) {
channel_name_ = CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
switches::kProcessChannelID);
Init();
}
ChildThread::ChildThread(const std::string& channel_name)
- : channel_name_(channel_name) {
+ : channel_name_(channel_name),
+ ALLOW_THIS_IN_INITIALIZER_LIST(channel_connected_factory_(this)) {
Init();
}
@@ -108,7 +129,6 @@
channel_->AddFilter(histogram_message_filter_.get());
channel_->AddFilter(sync_message_filter_.get());
channel_->AddFilter(new ChildTraceMessageFilter());
- LOG(INFO) << "ChildThread::Init";
#if defined(OS_POSIX)
// Check that --process-type is specified so we don't do this in unit tests
@@ -116,6 +136,12 @@
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kProcessType))
channel_->AddFilter(new SuicideOnChannelErrorFilter());
#endif
+
+ MessageLoop::current()->PostDelayedTask(
+ FROM_HERE,
+ base::Bind(&ChildThread::EnsureConnected,
+ channel_connected_factory_.GetWeakPtr()),
+ base::TimeDelta::FromSeconds(kConnectionTimeoutS));
}
ChildThread::~ChildThread() {
@@ -138,11 +164,10 @@
}
void ChildThread::OnChannelConnected(int32 peer_pid) {
- LOG(INFO) << "ChildThread::OnChannelConnected";
+ channel_connected_factory_.InvalidateWeakPtrs();
}
void ChildThread::OnChannelError() {
- LOG(INFO) << "ChildThread::OnChannelError";
set_on_channel_error_called(true);
MessageLoop::current()->Quit();
}
@@ -339,3 +364,8 @@
// inflight that would addref it.
Send(new ChildProcessHostMsg_ShutdownRequest);
}
+
+void ChildThread::EnsureConnected() {
+ LOG(INFO) << "ChildThread::EnsureConnected()";
+ base::KillProcess(base::GetCurrentProcessHandle(), 0, false);
+}
« no previous file with comments | « content/common/child_thread.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698