From 140a7cd1d47292be7c5872c6019c1ab09af774e3 Mon Sep 17 00:00:00 2001 From: "agl@chromium.org" Date: Tue, 28 Apr 2009 01:37:23 +0000 Subject: POSIX: don't spawn zombies. http://codereview.chromium.org/93147 BUG=9401 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14705 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser/renderer_host/browser_render_process_host.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'chrome/browser/renderer_host') diff --git a/chrome/browser/renderer_host/browser_render_process_host.cc b/chrome/browser/renderer_host/browser_render_process_host.cc index 0e25051..c7c01f8 100644 --- a/chrome/browser/renderer_host/browser_render_process_host.cc +++ b/chrome/browser/renderer_host/browser_render_process_host.cc @@ -668,13 +668,24 @@ void BrowserRenderProcessHost::OnChannelError() { DCHECK(process_.handle()); DCHECK(channel_.get()); - if (base::DidProcessCrash(process_.handle())) { + bool child_exited; + if (base::DidProcessCrash(&child_exited, process_.handle())) { NotificationService::current()->Notify( NotificationType::RENDERER_PROCESS_CRASHED, Source(this), NotificationService::NoDetails()); } - process_.Close(); + // POSIX: If the process crashed, then the kernel closed the socket for it + // and so the child has already died by the time we get here. Since + // DidProcessCrash called waitpid with WNOHANG, it'll reap the process. + // However, if DidProcessCrash didn't reap the child, we'll need to in + // ~BrowserRenderProcessHost via ProcessWatcher. So we can't close the handle + // here. + // + // This is moot on Windows where |child_exited| will always be true. + if (child_exited) + process_.Close(); + channel_.reset(); // This process should detach all the listeners, causing the object to be -- cgit v1.1