Chromium Code Reviews| Index: services/gles2/command_buffer_impl.cc |
| diff --git a/services/gles2/command_buffer_impl.cc b/services/gles2/command_buffer_impl.cc |
| index 29a772c010d3f327ebedc2b20e5d6e69bf660acf..8e7300137f5831ddab8530ede2dadf75bf23607d 100644 |
| --- a/services/gles2/command_buffer_impl.cc |
| +++ b/services/gles2/command_buffer_impl.cc |
| @@ -53,6 +53,7 @@ CommandBufferImpl::CommandBufferImpl( |
| gpu::SyncPointManager* sync_point_manager, |
| scoped_ptr<CommandBufferDriver> driver) |
| : sync_point_manager_(sync_point_manager), |
| + control_task_runner_(control_task_runner), |
| driver_task_runner_(base::MessageLoop::current()->task_runner()), |
| driver_(driver.Pass()), |
| viewport_parameter_listener_(listener.Pass()), |
| @@ -62,15 +63,12 @@ CommandBufferImpl::CommandBufferImpl( |
| driver_->set_client(make_scoped_ptr(new CommandBufferDriverClientImpl( |
| weak_factory_.GetWeakPtr(), control_task_runner))); |
| - control_task_runner->PostTask( |
| + control_task_runner_->PostTask( |
| FROM_HERE, base::Bind(&CommandBufferImpl::BindToRequest, |
| base::Unretained(this), base::Passed(&request))); |
| } |
| CommandBufferImpl::~CommandBufferImpl() { |
| - if (observer_) { |
| - observer_->OnCommandBufferImplDestroyed(); |
| - } |
| driver_task_runner_->PostTask( |
| FROM_HERE, base::Bind(&DestroyDriver, base::Passed(&driver_))); |
| } |
| @@ -147,10 +145,35 @@ void CommandBufferImpl::Echo(const mojo::Callback<void()>& callback) { |
| void CommandBufferImpl::BindToRequest( |
| mojo::InterfaceRequest<mojo::CommandBuffer> request) { |
| binding_.Bind(request.Pass()); |
| + binding_.set_error_handler(this); |
| } |
| void CommandBufferImpl::DidLoseContext() { |
| - binding_.OnConnectionError(); |
| + NotifyAndDestroy(); |
|
blundell
2015/06/03 14:48:59
This method is called on |control_task_runner_| at
etiennej
2015/06/03 15:00:40
Right. Fixed.
|
| +} |
| + |
| +void CommandBufferImpl::OnConnectionError() { |
| + // Called from the control_task_runner thread as we bound to the message pipe |
| + // handle on that thread. However, the observer have to be notified on the |
| + // thread that created this object, so we post on driver_task_runner. |
| + driver_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&CommandBufferImpl::NotifyAndDestroy, base::Unretained(this))); |
| +} |
| + |
| +void CommandBufferImpl::NotifyAndDestroy() { |
| + if (observer_) { |
| + observer_->OnCommandBufferImplDestroyed(); |
| + } |
| + // We have notified the observer on the right thread. However, destruction of |
| + // this object must happen on control_task_runner_ |
| + control_task_runner_->PostTask( |
| + FROM_HERE, |
| + base::Bind(&CommandBufferImpl::Destroy, base::Unretained(this))); |
| +} |
| + |
| +void CommandBufferImpl::Destroy() { |
| + delete this; |
| } |
| void CommandBufferImpl::UpdateVSyncParameters(base::TimeTicks timebase, |