Index: content/browser/mach_broker_mac.mm |
diff --git a/content/browser/mach_broker_mac.mm b/content/browser/mach_broker_mac.mm |
index f2e5f985c32a792b19455d96e9b762bc3a655eb7..0e0eec80bbd64429102d4b043f0861499c77fa87 100644 |
--- a/content/browser/mach_broker_mac.mm |
+++ b/content/browser/mach_broker_mac.mm |
@@ -195,11 +195,13 @@ void MachBroker::EnsureRunning() { |
} |
} |
-void MachBroker::AddPlaceholderForPid(base::ProcessHandle pid) { |
+void MachBroker::AddPlaceholderForPid(base::ProcessHandle pid, |
+ int child_process_id) { |
lock_.AssertAcquired(); |
DCHECK_EQ(0u, mach_map_.count(pid)); |
mach_map_[pid] = MACH_PORT_NULL; |
+ child_process_id_map_[child_process_id] = pid; |
} |
mach_port_t MachBroker::TaskForPid(base::ProcessHandle pid) const { |
@@ -212,33 +214,27 @@ mach_port_t MachBroker::TaskForPid(base::ProcessHandle pid) const { |
void MachBroker::BrowserChildProcessHostDisconnected( |
const ChildProcessData& data) { |
- InvalidatePid(data.handle); |
+ InvalidateChildProcessId(data.id); |
} |
void MachBroker::BrowserChildProcessCrashed(const ChildProcessData& data) { |
- InvalidatePid(data.handle); |
+ InvalidateChildProcessId(data.id); |
} |
void MachBroker::Observe(int type, |
const NotificationSource& source, |
const NotificationDetails& details) { |
- // TODO(rohitrao): These notifications do not always carry the proper PIDs, |
- // especially when the renderer is already gone or has crashed. Find a better |
- // way to listen for child process deaths. http://crbug.com/55734 |
- base::ProcessHandle handle = 0; |
switch (type) { |
- case NOTIFICATION_RENDERER_PROCESS_CLOSED: |
- handle = Details<RenderProcessHost::RendererClosedDetails>( |
- details)->handle; |
- break; |
case NOTIFICATION_RENDERER_PROCESS_TERMINATED: |
- handle = Source<RenderProcessHost>(source)->GetHandle(); |
+ case NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
+ RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); |
+ InvalidateChildProcessId(host->GetID()); |
break; |
+ } |
default: |
NOTREACHED() << "Unexpected notification"; |
break; |
} |
- InvalidatePid(handle); |
} |
MachBroker::MachBroker() : listener_thread_started_(false) { |
@@ -262,16 +258,21 @@ void MachBroker::FinalizePid(base::ProcessHandle pid, |
it->second = task_port; |
} |
-void MachBroker::InvalidatePid(base::ProcessHandle pid) { |
+void MachBroker::InvalidateChildProcessId(int child_process_id) { |
base::AutoLock lock(lock_); |
- MachBroker::MachMap::iterator it = mach_map_.find(pid); |
- if (it == mach_map_.end()) |
+ MachBroker::ChildProcessIdMap::iterator it = |
+ child_process_id_map_.find(child_process_id); |
+ if (it == child_process_id_map_.end()) |
return; |
- kern_return_t kr = mach_port_deallocate(mach_task_self(), |
- it->second); |
- MACH_LOG_IF(WARNING, kr != KERN_SUCCESS, kr) << "mach_port_deallocate"; |
- mach_map_.erase(it); |
+ MachMap::iterator mach_it = mach_map_.find(it->second); |
+ if (mach_it != mach_map_.end()) { |
+ kern_return_t kr = mach_port_deallocate(mach_task_self(), |
+ mach_it->second); |
+ MACH_LOG_IF(WARNING, kr != KERN_SUCCESS, kr) << "mach_port_deallocate"; |
+ mach_map_.erase(mach_it); |
+ } |
+ child_process_id_map_.erase(it); |
} |
// static |