Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: content/browser/gpu/browser_gpu_memory_buffer_manager.cc

Issue 709433002: Revert of content: Cleanup GpuMemoryBuffers when child process is removed. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@gpu-memory-buffer-id-refactor
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" 5 #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h"
6 6
7 #include "base/atomic_sequence_num.h" 7 #include "base/atomic_sequence_num.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "base/threading/thread_restrictions.h" 12 #include "base/threading/thread_restrictions.h"
13 #include "content/common/gpu/client/gpu_memory_buffer_impl.h" 13 #include "content/common/gpu/client/gpu_memory_buffer_impl.h"
14 #include "content/public/browser/browser_thread.h" 14 #include "content/public/browser/browser_thread.h"
15 15
16 namespace content { 16 namespace content {
17 namespace { 17 namespace {
18 18
19 void GpuMemoryBufferAllocatedForChildProcess(
20 const BrowserGpuMemoryBufferManager::AllocationCallback& callback,
21 const gfx::GpuMemoryBufferHandle& handle) {
22 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
23
24 callback.Run(handle);
25 }
26
19 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr; 27 BrowserGpuMemoryBufferManager* g_gpu_memory_buffer_manager = nullptr;
20 28
21 // Global atomic to generate gpu memory buffer unique IDs. 29 // Global atomic to generate gpu memory buffer unique IDs.
22 base::StaticAtomicSequenceNumber g_next_gpu_memory_buffer_id; 30 base::StaticAtomicSequenceNumber g_next_gpu_memory_buffer_id;
23 31
24 } // namespace 32 } // namespace
25 33
26 struct BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferRequest { 34 struct BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferRequest {
27 AllocateGpuMemoryBufferRequest(const gfx::Size& size, 35 AllocateGpuMemoryBufferRequest(const gfx::Size& size,
28 gfx::GpuMemoryBuffer::Format format, 36 gfx::GpuMemoryBuffer::Format format,
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 89
82 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess( 90 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferForChildProcess(
83 const gfx::Size& size, 91 const gfx::Size& size,
84 gfx::GpuMemoryBuffer::Format format, 92 gfx::GpuMemoryBuffer::Format format,
85 gfx::GpuMemoryBuffer::Usage usage, 93 gfx::GpuMemoryBuffer::Usage usage,
86 base::ProcessHandle child_process_handle, 94 base::ProcessHandle child_process_handle,
87 int child_client_id, 95 int child_client_id,
88 const AllocationCallback& callback) { 96 const AllocationCallback& callback) {
89 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 97 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
90 98
91 gfx::GpuMemoryBufferId new_id = g_next_gpu_memory_buffer_id.GetNext();
92
93 BufferMap& buffers = clients_[child_client_id];
94 DCHECK(buffers.find(new_id) == buffers.end());
95
96 // Note: Handling of cases where the child process is removed before the
97 // allocation completes is less subtle if we set the buffer type to
98 // EMPTY_BUFFER here and verify that this has not changed when allocation
99 // completes.
100 buffers[new_id] = gfx::EMPTY_BUFFER;
101
102 GpuMemoryBufferImpl::AllocateForChildProcess( 99 GpuMemoryBufferImpl::AllocateForChildProcess(
103 new_id, 100 g_next_gpu_memory_buffer_id.GetNext(),
104 size, 101 size,
105 format, 102 format,
106 usage, 103 usage,
107 child_process_handle, 104 child_process_handle,
108 child_client_id, 105 child_client_id,
109 base::Bind(&BrowserGpuMemoryBufferManager:: 106 base::Bind(&GpuMemoryBufferAllocatedForChildProcess, callback));
110 GpuMemoryBufferAllocatedForChildProcess,
111 base::Unretained(this),
112 child_process_handle,
113 child_client_id,
114 callback));
115 } 107 }
116 108
117 gfx::GpuMemoryBuffer* 109 gfx::GpuMemoryBuffer*
118 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer( 110 BrowserGpuMemoryBufferManager::GpuMemoryBufferFromClientBuffer(
119 ClientBuffer buffer) { 111 ClientBuffer buffer) {
120 return GpuMemoryBufferImpl::FromClientBuffer(buffer); 112 return GpuMemoryBufferImpl::FromClientBuffer(buffer);
121 } 113 }
122 114
123 void BrowserGpuMemoryBufferManager::SetDestructionSyncPoint(
124 gfx::GpuMemoryBuffer* buffer,
125 uint32 sync_point) {
126 static_cast<GpuMemoryBufferImpl*>(buffer)
127 ->set_destruction_sync_point(sync_point);
128 }
129
130 void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer( 115 void BrowserGpuMemoryBufferManager::ChildProcessDeletedGpuMemoryBuffer(
116 gfx::GpuMemoryBufferType type,
131 gfx::GpuMemoryBufferId id, 117 gfx::GpuMemoryBufferId id,
132 base::ProcessHandle child_process_handle, 118 base::ProcessHandle child_process_handle,
133 int child_client_id, 119 int child_client_id,
134 uint32 sync_point) { 120 uint32 sync_point) {
135 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 121 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
136 DCHECK(clients_.find(child_client_id) != clients_.end());
137
138 BufferMap& buffers = clients_[child_client_id];
139
140 BufferMap::iterator buffer_it = buffers.find(id);
141 if (buffer_it == buffers.end()) {
142 LOG(ERROR) << "Invalid GpuMemoryBuffer ID for child process.";
143 return;
144 }
145
146 // This can happen if a child process managed to trigger a call to this while
147 // a buffer is in the process of being allocated.
148 if (buffer_it->second == gfx::EMPTY_BUFFER) {
149 LOG(ERROR) << "Invalid GpuMemoryBuffer type.";
150 return;
151 }
152 122
153 GpuMemoryBufferImpl::DeletedByChildProcess( 123 GpuMemoryBufferImpl::DeletedByChildProcess(
154 buffer_it->second, id, child_process_handle, child_client_id, sync_point); 124 type, id, child_process_handle, child_client_id, sync_point);
155
156 buffers.erase(buffer_it);
157 } 125 }
158 126
159 void BrowserGpuMemoryBufferManager::ProcessRemoved( 127 void BrowserGpuMemoryBufferManager::ProcessRemoved(
160 base::ProcessHandle process_handle, 128 base::ProcessHandle process_handle) {
161 int client_id) { 129 // TODO(reveman): Handle child process removal correctly.
162 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
163
164 ClientMap::iterator client_it = clients_.find(client_id);
165 if (client_it == clients_.end())
166 return;
167
168 for (auto &buffer_it : client_it->second) {
169 // This might happen if buffer is currenlty in the process of being
170 // allocated. The buffer will in that case be cleaned up when allocation
171 // completes.
172 if (buffer_it.second == gfx::EMPTY_BUFFER)
173 continue;
174
175 GpuMemoryBufferImpl::DeletedByChildProcess(buffer_it.second,
176 buffer_it.first,
177 process_handle,
178 client_id,
179 0);
180 }
181
182 clients_.erase(client_it);
183 }
184
185 void BrowserGpuMemoryBufferManager::GpuMemoryBufferAllocatedForChildProcess(
186 base::ProcessHandle child_process_handle,
187 int child_client_id,
188 const AllocationCallback& callback,
189 const gfx::GpuMemoryBufferHandle& handle) {
190 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
191
192 ClientMap::iterator client_it = clients_.find(child_client_id);
193
194 // This can happen if the child process is removed while the buffer is being
195 // allocated.
196 if (client_it == clients_.end()) {
197 if (!handle.is_null()) {
198 GpuMemoryBufferImpl::DeletedByChildProcess(handle.type,
199 handle.id,
200 child_process_handle,
201 child_client_id,
202 0);
203 }
204 callback.Run(gfx::GpuMemoryBufferHandle());
205 return;
206 }
207
208 BufferMap& buffers = client_it->second;
209
210 BufferMap::iterator buffer_it = buffers.find(handle.id);
211 DCHECK(buffer_it != buffers.end());
212 DCHECK_EQ(buffer_it->second, gfx::EMPTY_BUFFER);
213
214 if (handle.is_null()) {
215 buffers.erase(buffer_it);
216 callback.Run(gfx::GpuMemoryBufferHandle());
217 return;
218 }
219
220 // Store the type for this buffer so it can be cleaned up if the child
221 // process is removed.
222 buffer_it->second = handle.type;
223
224 callback.Run(handle);
225 } 130 }
226 131
227 // static 132 // static
228 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO( 133 void BrowserGpuMemoryBufferManager::AllocateGpuMemoryBufferOnIO(
229 AllocateGpuMemoryBufferRequest* request) { 134 AllocateGpuMemoryBufferRequest* request) {
230 GpuMemoryBufferImpl::Create( 135 GpuMemoryBufferImpl::Create(
231 g_next_gpu_memory_buffer_id.GetNext(), 136 g_next_gpu_memory_buffer_id.GetNext(),
232 request->size, 137 request->size,
233 request->format, 138 request->format,
234 request->usage, 139 request->usage,
235 request->client_id, 140 request->client_id,
236 base::Bind(&BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO, 141 base::Bind(&BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO,
237 base::Unretained(request))); 142 base::Unretained(request)));
238 } 143 }
239 144
240 // static 145 // static
241 void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO( 146 void BrowserGpuMemoryBufferManager::GpuMemoryBufferCreatedOnIO(
242 AllocateGpuMemoryBufferRequest* request, 147 AllocateGpuMemoryBufferRequest* request,
243 scoped_ptr<GpuMemoryBufferImpl> buffer) { 148 scoped_ptr<GpuMemoryBufferImpl> buffer) {
244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 149 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
245 150
246 request->result = buffer.Pass(); 151 request->result = buffer.Pass();
247 request->event.Signal(); 152 request->event.Signal();
248 } 153 }
249 154
155 void BrowserGpuMemoryBufferManager::SetDestructionSyncPoint(
156 gfx::GpuMemoryBuffer* buffer,
157 uint32 sync_point) {
158 static_cast<GpuMemoryBufferImpl*>(buffer)
159 ->set_destruction_sync_point(sync_point);
160 }
161
250 } // namespace content 162 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/gpu/browser_gpu_memory_buffer_manager.h ('k') | content/browser/renderer_host/render_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698