Index: chrome/browser/gpu_process_host_ui_shim.cc |
=================================================================== |
--- chrome/browser/gpu_process_host_ui_shim.cc (revision 75655) |
+++ chrome/browser/gpu_process_host_ui_shim.cc (working copy) |
@@ -108,6 +108,7 @@ |
GpuProcessHostUIShim::GpuProcessHostUIShim() |
: host_id_(++g_last_host_id), |
+ gpu_process_(NULL), |
gpu_feature_flags_set_(false) { |
g_hosts_by_id.AddWithID(this, host_id_); |
} |
@@ -147,6 +148,18 @@ |
} |
// static |
+void GpuProcessHostUIShim::NotifyGpuProcessLaunched( |
+ int host_id, |
+ base::ProcessHandle gpu_process) { |
+ DCHECK(gpu_process); |
+ |
+ GpuProcessHostUIShim* ui_shim = FromID(host_id); |
+ DCHECK(ui_shim); |
+ |
+ ui_shim->gpu_process_ = gpu_process; |
+} |
+ |
+// static |
GpuProcessHostUIShim* GpuProcessHostUIShim::FromID(int host_id) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
if (host_id == 0) |
@@ -171,20 +184,25 @@ |
void EstablishChannelCallbackDispatcher( |
GpuProcessHostUIShim::EstablishChannelCallback* callback, |
const IPC::ChannelHandle& channel_handle, |
+ base::ProcessHandle gpu_renderer_process, |
const GPUInfo& gpu_info) { |
scoped_ptr<GpuProcessHostUIShim::EstablishChannelCallback> |
wrapped_callback(callback); |
- wrapped_callback->Run(channel_handle, gpu_info); |
+ wrapped_callback->Run(channel_handle, gpu_renderer_process, gpu_info); |
} |
void EstablishChannelError( |
GpuProcessHostUIShim::EstablishChannelCallback* callback, |
const IPC::ChannelHandle& channel_handle, |
+ base::ProcessHandle gpu_renderer_process, |
const GPUInfo& gpu_info) { |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
NewRunnableFunction(&EstablishChannelCallbackDispatcher, |
- callback, channel_handle, gpu_info)); |
+ callback, |
+ channel_handle, |
+ gpu_renderer_process, |
+ gpu_info)); |
} |
void SynchronizeCallbackDispatcher( |
@@ -225,7 +243,10 @@ |
while (!channel_requests_.empty()) { |
linked_ptr<EstablishChannelCallback> callback = channel_requests_.front(); |
channel_requests_.pop(); |
- EstablishChannelError(callback.release(), IPC::ChannelHandle(), GPUInfo()); |
+ EstablishChannelError(callback.release(), |
+ IPC::ChannelHandle(), |
+ NULL, |
+ GPUInfo()); |
} |
// Now unblock all renderers waiting for synchronization replies. |
@@ -246,14 +267,15 @@ |
} |
void GpuProcessHostUIShim::EstablishGpuChannel( |
- int renderer_id, EstablishChannelCallback *callback) { |
+ int renderer_id, |
+ EstablishChannelCallback *callback) { |
DCHECK(CalledOnValidThread()); |
linked_ptr<EstablishChannelCallback> wrapped_callback(callback); |
// If GPU features are already blacklisted, no need to establish the channel. |
if (gpu_feature_flags_.flags() != 0) { |
EstablishChannelError( |
- wrapped_callback.release(), IPC::ChannelHandle(), GPUInfo()); |
+ wrapped_callback.release(), IPC::ChannelHandle(), NULL, GPUInfo()); |
return; |
} |
@@ -261,7 +283,7 @@ |
channel_requests_.push(wrapped_callback); |
} else { |
EstablishChannelError( |
- wrapped_callback.release(), IPC::ChannelHandle(), GPUInfo()); |
+ wrapped_callback.release(), IPC::ChannelHandle(), NULL, GPUInfo()); |
} |
} |
@@ -340,6 +362,11 @@ |
GpuProcessHostUIShim::~GpuProcessHostUIShim() { |
DCHECK(CalledOnValidThread()); |
g_hosts_by_id.Remove(host_id_); |
+ |
+#if defined(OS_WIN) |
+ if (gpu_process_) |
+ CloseHandle(gpu_process_); |
+#endif |
} |
bool GpuProcessHostUIShim::Init() { |
@@ -390,6 +417,10 @@ |
void GpuProcessHostUIShim::OnChannelEstablished( |
const IPC::ChannelHandle& channel_handle, |
const GPUInfo& gpu_info) { |
+ // The GPU process should have launched at this point and this object should |
+ // have been notified of its process handle. |
+ DCHECK(gpu_process_); |
+ |
uint32 max_entry_id = gpu_blacklist_->max_entry_id(); |
// max_entry_id can be zero if we failed to load the GPU blacklist, don't |
// bother with histograms then. |
@@ -429,11 +460,15 @@ |
// GPU channel. |
if (gpu_feature_flags_.flags() != 0) { |
Send(new GpuMsg_CloseChannel(channel_handle)); |
- EstablishChannelError(callback.release(), IPC::ChannelHandle(), gpu_info); |
+ EstablishChannelError(callback.release(), |
+ IPC::ChannelHandle(), |
+ NULL, |
+ gpu_info); |
AddCustomLogMessage(logging::LOG_WARNING, "WARNING", "GPU is blacklisted."); |
- } else { |
- callback->Run(channel_handle, gpu_info); |
+ return; |
} |
+ |
+ callback->Run(channel_handle, gpu_process_, gpu_info); |
} |
void GpuProcessHostUIShim::OnSynchronizeReply() { |