| Index: content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| diff --git a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| index bd7f053edd5f44d84f96111ae3807822255087eb..b6162ba5c4549fc2f22e1644687edb831b0c1828 100644
|
| --- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| +++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
|
| @@ -165,7 +165,8 @@ void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
|
| new_id, size, format, usage, child_client_id, 0,
|
| base::Bind(&BrowserGpuMemoryBufferManager::
|
| GpuMemoryBufferAllocatedForChildProcess,
|
| - weak_ptr_factory_.GetWeakPtr(), child_client_id, callback));
|
| + weak_ptr_factory_.GetWeakPtr(), new_id, child_client_id,
|
| + callback));
|
| }
|
|
|
| gfx::GpuMemoryBuffer*
|
| @@ -314,6 +315,7 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferDeleted(
|
| }
|
|
|
| void BrowserGpuMemoryBufferManager::GpuMemoryBufferAllocatedForChildProcess(
|
| + gfx::GpuMemoryBufferId id,
|
| int child_client_id,
|
| const AllocationCallback& callback,
|
| const gfx::GpuMemoryBufferHandle& handle) {
|
| @@ -334,19 +336,21 @@ void BrowserGpuMemoryBufferManager::GpuMemoryBufferAllocatedForChildProcess(
|
|
|
| BufferMap& buffers = client_it->second;
|
|
|
| - BufferMap::iterator buffer_it = buffers.find(handle.id);
|
| + BufferMap::iterator buffer_it = buffers.find(id);
|
| DCHECK(buffer_it != buffers.end());
|
| DCHECK_EQ(buffer_it->second.type, gfx::EMPTY_BUFFER);
|
|
|
| - if (handle.is_null()) {
|
| + // If the handle isn't valid, that means that the GPU process crashed or is
|
| + // misbehaving so we remove the buffer entry and run the allocation callback
|
| + // with an empty handle to indicate failure.
|
| + bool valid_handle = !handle.is_null() && handle.id == id &&
|
| + handle.type != gfx::SHARED_MEMORY_BUFFER;
|
| + if (!valid_handle) {
|
| buffers.erase(buffer_it);
|
| callback.Run(gfx::GpuMemoryBufferHandle());
|
| return;
|
| }
|
|
|
| - // The factory should never return a shared memory backed buffer.
|
| - DCHECK_NE(handle.type, gfx::SHARED_MEMORY_BUFFER);
|
| -
|
| // Store the type of this buffer so it can be cleaned up if the child
|
| // process is removed.
|
| buffer_it->second.type = handle.type;
|
|
|