| Index: gpu/command_buffer/service/in_process_command_buffer.cc
|
| diff --git a/gpu/command_buffer/service/in_process_command_buffer.cc b/gpu/command_buffer/service/in_process_command_buffer.cc
|
| index 692fb8e38a8ca88b43c31eb43f53c9779e5a793e..24628f5b12d784e9b81508c6c2c603b09087cb79 100644
|
| --- a/gpu/command_buffer/service/in_process_command_buffer.cc
|
| +++ b/gpu/command_buffer/service/in_process_command_buffer.cc
|
| @@ -221,6 +221,21 @@ gfx::GpuMemoryBufferHandle ShareGpuMemoryBufferToGpuThread(
|
| }
|
| }
|
|
|
| +scoped_refptr<InProcessCommandBuffer::Service> GetInitialService(
|
| + const scoped_refptr<InProcessCommandBuffer::Service>& service) {
|
| + if (service)
|
| + return service;
|
| +
|
| + // Call base::ThreadTaskRunnerHandle::IsSet() to ensure that it is
|
| + // instantiated before we create the GPU thread, otherwise shutdown order will
|
| + // delete the ThreadTaskRunnerHandle before the GPU thread's message loop,
|
| + // and when the message loop is shutdown, it will recreate
|
| + // ThreadTaskRunnerHandle, which will re-add a new task to the, AtExitManager,
|
| + // which causes a deadlock because it's already locked.
|
| + base::ThreadTaskRunnerHandle::IsSet();
|
| + return g_default_service.Get().gpu_thread;
|
| +}
|
| +
|
| } // anonyous namespace
|
|
|
| InProcessCommandBuffer::Service::Service() {}
|
| @@ -271,7 +286,7 @@ InProcessCommandBuffer::InProcessCommandBuffer(
|
| last_put_offset_(-1),
|
| gpu_memory_buffer_manager_(nullptr),
|
| flush_event_(false, false),
|
| - service_(service.get() ? service : g_default_service.Get().gpu_thread),
|
| + service_(GetInitialService(service)),
|
| gpu_thread_weak_ptr_factory_(this) {
|
| DCHECK(service_.get());
|
| next_image_id_.GetNext();
|
|
|