Commit 840a1d1a authored by piman@chromium.org's avatar piman@chromium.org

Don't reuse a GpuProcessHost that failed to send a message

When the GPU process dies/gets killed, the Send() can fail (e.g. EPIPE),
triggering lost context recreation, before OnChannelError gets called (happening
when we return to the message loop) which ends up deleting the GpuProcessHost.
So, in the mean time, make sure we don't try to reuse that GpuProcessHost to
recreate a channel.

BUG=129067


Review URL: https://chromiumcodereview.appspot.com/10834165

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@149984 0039d316-1c4b-4281-b951-d872f2087c98
parent 84dc1951
......@@ -240,8 +240,9 @@ bool GpuProcessHost::HostIsValid(GpuProcessHost* host) {
// blacklisted, and we can kill it and start over.
if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSingleProcess) ||
CommandLine::ForCurrentProcess()->HasSwitch(switches::kInProcessGPU) ||
host->software_rendering() ||
!GpuDataManagerImpl::GetInstance()->ShouldUseSoftwareRendering()) {
(host->valid_ &&
(host->software_rendering() ||
!GpuDataManagerImpl::GetInstance()->ShouldUseSoftwareRendering()))) {
return true;
}
......@@ -307,6 +308,7 @@ GpuProcessHost* GpuProcessHost::FromID(int host_id) {
GpuProcessHost::GpuProcessHost(int host_id, GpuProcessKind kind)
: host_id_(host_id),
valid_(true),
in_process_(false),
software_rendering_(false),
kind_(kind),
......@@ -443,7 +445,10 @@ bool GpuProcessHost::Send(IPC::Message* msg) {
return true;
}
return process_->Send(msg);
bool result = process_->Send(msg);
if (!result)
valid_ = false;
return result;
}
bool GpuProcessHost::OnMessageReceived(const IPC::Message& message) {
......
......@@ -171,6 +171,9 @@ class GpuProcessHost : public content::BrowserChildProcessHostDelegate,
// Qeueud messages to send when the process launches.
std::queue<IPC::Message*> queued_messages_;
// Whether the GPU process is valid, set to false after Send() failed.
bool valid_;
// Whether we are running a GPU thread inside the browser process instead
// of a separate GPU process.
bool in_process_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment