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

Side by Side Diff: chrome/browser/renderer_host/render_widget_helper.cc

Issue 21485: Bitmap transport (Closed)
Patch Set: Fix some mac crashes Created 11 years, 10 months 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 (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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 "chrome/browser/renderer_host/render_widget_helper.h" 5 #include "chrome/browser/renderer_host/render_widget_helper.h"
6 6
7 #include "base/thread.h" 7 #include "base/thread.h"
8 #include "chrome/browser/browser_process.h" 8 #include "chrome/browser/browser_process.h"
9 #include "chrome/browser/renderer_host/render_process_host.h" 9 #include "chrome/browser/renderer_host/render_process_host.h"
10 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" 10 #include "chrome/browser/renderer_host/resource_dispatcher_host.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 #elif defined(OS_POSIX) 49 #elif defined(OS_POSIX)
50 event_(false /* auto-reset */, false), 50 event_(false /* auto-reset */, false),
51 #endif 51 #endif
52 block_popups_(false) { 52 block_popups_(false) {
53 } 53 }
54 54
55 RenderWidgetHelper::~RenderWidgetHelper() { 55 RenderWidgetHelper::~RenderWidgetHelper() {
56 // The elements of pending_paints_ each hold an owning reference back to this 56 // The elements of pending_paints_ each hold an owning reference back to this
57 // object, so we should not be destroyed unless pending_paints_ is empty! 57 // object, so we should not be destroyed unless pending_paints_ is empty!
58 DCHECK(pending_paints_.empty()); 58 DCHECK(pending_paints_.empty());
59
60 #if defined(OS_MACOSX)
61 ClearAllocatedDIBs();
62 #endif
59 } 63 }
60 64
61 int RenderWidgetHelper::GetNextRoutingID() { 65 int RenderWidgetHelper::GetNextRoutingID() {
62 return next_routing_id_.GetNext() + 1; 66 return next_routing_id_.GetNext() + 1;
63 } 67 }
64 68
65 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { 69 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) {
66 if (g_browser_process->io_thread()) { 70 if (g_browser_process->io_thread()) {
67 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, 71 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE,
68 NewRunnableMethod(this, 72 NewRunnableMethod(this,
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( 241 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod(
238 this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg)); 242 this, &RenderWidgetHelper::OnSimulateReceivedMessage, msg));
239 } 243 }
240 244
241 void RenderWidgetHelper::OnSimulateReceivedMessage( 245 void RenderWidgetHelper::OnSimulateReceivedMessage(
242 const IPC::Message& message) { 246 const IPC::Message& message) {
243 RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_); 247 RenderProcessHost* host = RenderProcessHost::FromID(render_process_id_);
244 if (host) 248 if (host)
245 host->OnMessageReceived(message); 249 host->OnMessageReceived(message);
246 } 250 }
251
252 #if defined(OS_MACOSX)
253 TransportDIB* RenderWidgetHelper::MapTransportDIB(TransportDIB::Id dib_id) {
254 AutoLock locked(allocated_dibs_lock_);
255
256 const std::map<TransportDIB::Id, int>::iterator
257 i = allocated_dibs_.find(dib_id);
258 if (i == allocated_dibs_.end())
259 return NULL;
260
261 base::FileDescriptor fd(dup(i->second), true);
262 return TransportDIB::Map(fd);
263 }
264
265 void RenderWidgetHelper::AllocTransportDIB(
266 size_t size, IPC::Maybe<TransportDIB::Handle>* result) {
267 base::SharedMemory* shared_memory = new base::SharedMemory();
268 if (!shared_memory->Create(L"", false /* read write */,
269 false /* do not open existing */, size)) {
270 result->valid = false;
271 delete shared_memory;
272 return;
273 }
274
275 result->valid = true;
276 shared_memory->GiveToProcess(0 /* pid, not needed */, &result->value);
277
278 // Keep a copy of the file descriptor around
279 AutoLock locked(allocated_dibs_lock_);
280 allocated_dibs_[shared_memory->id()] = dup(result->value.fd);
281 }
282
283 void RenderWidgetHelper::FreeTransportDIB(TransportDIB::Id dib_id) {
284 AutoLock locked(allocated_dibs_lock_);
285
286 const std::map<TransportDIB::Id, int>::iterator
287 i = allocated_dibs_.find(dib_id);
288
289 if (i != allocated_dibs_.end()) {
290 close(i->second);
291 allocated_dibs_.erase(i);
292 } else {
293 DLOG(WARNING) << "Renderer asked us to free unknown transport DIB";
294 }
295 }
296
297 void RenderWidgetHelper::ClearAllocatedDIBs() {
298 for (std::map<TransportDIB::Id, int>::iterator
299 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) {
300 close(i->second);
301 }
302
303 allocated_dibs_.clear();
304 }
305 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698