| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/child/child_shared_bitmap_manager.h" | 5 #include "content/child/child_shared_bitmap_manager.h" |
| 6 | 6 |
| 7 #include "content/child/child_thread.h" | 7 #include "content/child/child_thread.h" |
| 8 #include "content/common/child_process_messages.h" | 8 #include "content/common/child_process_messages.h" |
| 9 #include "ui/gfx/size.h" | 9 #include "ui/gfx/size.h" |
| 10 | 10 |
| 11 namespace content { | 11 namespace content { |
| 12 | 12 |
| 13 namespace { |
| 14 |
| 15 void FreeSharedMemory(scoped_refptr<ThreadSafeSender> sender, |
| 16 cc::SharedBitmap* bitmap) { |
| 17 TRACE_EVENT0("renderer", "ChildSharedBitmapManager::FreeSharedMemory"); |
| 18 sender->Send(new ChildProcessHostMsg_DeletedSharedBitmap(bitmap->id())); |
| 19 delete bitmap->memory(); |
| 20 } |
| 21 |
| 22 void ReleaseSharedBitmap(scoped_refptr<ThreadSafeSender> sender, |
| 23 cc::SharedBitmap* handle) { |
| 24 TRACE_EVENT0("renderer", "ChildSharedBitmapManager::ReleaseSharedBitmap"); |
| 25 sender->Send(new ChildProcessHostMsg_DeletedSharedBitmap(handle->id())); |
| 26 } |
| 27 |
| 28 } // namespace |
| 29 |
| 13 ChildSharedBitmapManager::ChildSharedBitmapManager( | 30 ChildSharedBitmapManager::ChildSharedBitmapManager( |
| 14 scoped_refptr<ThreadSafeSender> sender) | 31 scoped_refptr<ThreadSafeSender> sender) |
| 15 : sender_(sender) {} | 32 : sender_(sender) { |
| 33 } |
| 16 | 34 |
| 17 ChildSharedBitmapManager::~ChildSharedBitmapManager() {} | 35 ChildSharedBitmapManager::~ChildSharedBitmapManager() {} |
| 18 | 36 |
| 19 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::AllocateSharedBitmap( | 37 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::AllocateSharedBitmap( |
| 20 const gfx::Size& size) { | 38 const gfx::Size& size) { |
| 21 TRACE_EVENT2("renderer", | 39 TRACE_EVENT2("renderer", |
| 22 "ChildSharedBitmapManager::AllocateSharedMemory", | 40 "ChildSharedBitmapManager::AllocateSharedMemory", |
| 23 "width", | 41 "width", |
| 24 size.width(), | 42 size.width(), |
| 25 "height", | 43 "height", |
| 26 size.height()); | 44 size.height()); |
| 27 size_t memory_size; | 45 size_t memory_size; |
| 28 if (!cc::SharedBitmap::SizeInBytes(size, &memory_size)) | 46 if (!cc::SharedBitmap::SizeInBytes(size, &memory_size)) |
| 29 return scoped_ptr<cc::SharedBitmap>(); | 47 return scoped_ptr<cc::SharedBitmap>(); |
| 30 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); | 48 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); |
| 31 scoped_ptr<base::SharedMemory> memory; | 49 scoped_ptr<base::SharedMemory> memory; |
| 32 #if defined(OS_POSIX) | 50 #if defined(OS_POSIX) |
| 33 base::SharedMemoryHandle handle; | 51 base::SharedMemoryHandle handle; |
| 34 sender_->Send(new ChildProcessHostMsg_SyncAllocateSharedBitmap( | 52 sender_->Send(new ChildProcessHostMsg_SyncAllocateSharedBitmap( |
| 35 memory_size, id, &handle)); | 53 memory_size, id, &handle)); |
| 36 memory = make_scoped_ptr(new base::SharedMemory(handle, false)); | 54 memory = make_scoped_ptr(new base::SharedMemory(handle, false)); |
| 37 CHECK(memory->Map(memory_size)); | 55 CHECK(memory->Map(memory_size)); |
| 38 #else | 56 #else |
| 39 memory.reset(ChildThread::AllocateSharedMemory(memory_size, sender_)); | 57 memory.reset(ChildThread::AllocateSharedMemory(memory_size, sender_)); |
| 40 CHECK(memory); | 58 CHECK(memory); |
| 41 base::SharedMemoryHandle handle_to_send = memory->handle(); | 59 base::SharedMemoryHandle handle_to_send = memory->handle(); |
| 42 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap( | 60 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap( |
| 43 memory_size, handle_to_send, id)); | 61 memory_size, handle_to_send, id)); |
| 44 #endif | 62 #endif |
| 45 // The compositor owning the SharedBitmap will be closed before the | |
| 46 // ChildThread containng this, making the use of base::Unretained safe. | |
| 47 return scoped_ptr<cc::SharedBitmap>(new cc::SharedBitmap( | 63 return scoped_ptr<cc::SharedBitmap>(new cc::SharedBitmap( |
| 48 memory.release(), | 64 memory.release(), id, base::Bind(&FreeSharedMemory, sender_))); |
| 49 id, | |
| 50 base::Bind(&ChildSharedBitmapManager::FreeSharedMemory, | |
| 51 base::Unretained(this)))); | |
| 52 } | 65 } |
| 53 | 66 |
| 54 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetSharedBitmapFromId( | 67 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetSharedBitmapFromId( |
| 55 const gfx::Size&, | 68 const gfx::Size&, |
| 56 const cc::SharedBitmapId&) { | 69 const cc::SharedBitmapId&) { |
| 57 NOTREACHED(); | 70 NOTREACHED(); |
| 58 return scoped_ptr<cc::SharedBitmap>(); | 71 return scoped_ptr<cc::SharedBitmap>(); |
| 59 } | 72 } |
| 60 | 73 |
| 61 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetBitmapForSharedMemory( | 74 scoped_ptr<cc::SharedBitmap> ChildSharedBitmapManager::GetBitmapForSharedMemory( |
| 62 base::SharedMemory* mem) { | 75 base::SharedMemory* mem) { |
| 63 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); | 76 cc::SharedBitmapId id = cc::SharedBitmap::GenerateId(); |
| 64 base::SharedMemoryHandle handle_to_send = mem->handle(); | 77 base::SharedMemoryHandle handle_to_send = mem->handle(); |
| 65 #if defined(OS_POSIX) | 78 #if defined(OS_POSIX) |
| 66 if (!mem->ShareToProcess(base::GetCurrentProcessHandle(), &handle_to_send)) | 79 if (!mem->ShareToProcess(base::GetCurrentProcessHandle(), &handle_to_send)) |
| 67 return scoped_ptr<cc::SharedBitmap>(); | 80 return scoped_ptr<cc::SharedBitmap>(); |
| 68 #endif | 81 #endif |
| 69 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap( | 82 sender_->Send(new ChildProcessHostMsg_AllocatedSharedBitmap( |
| 70 mem->mapped_size(), handle_to_send, id)); | 83 mem->mapped_size(), handle_to_send, id)); |
| 71 // The compositor owning the SharedBitmap will be closed before the | 84 // The compositor owning the SharedBitmap will be closed before the |
| 72 // ChildThread containng this, making the use of base::Unretained safe. | 85 // ChildThread containng this, making the use of base::Unretained safe. |
| 73 return scoped_ptr<cc::SharedBitmap>(new cc::SharedBitmap( | 86 return scoped_ptr<cc::SharedBitmap>( |
| 74 mem, | 87 new cc::SharedBitmap(mem, id, base::Bind(&ReleaseSharedBitmap, sender_))); |
| 75 id, | |
| 76 base::Bind(&ChildSharedBitmapManager::ReleaseSharedBitmap, | |
| 77 base::Unretained(this)))); | |
| 78 } | |
| 79 | |
| 80 void ChildSharedBitmapManager::FreeSharedMemory(cc::SharedBitmap* bitmap) { | |
| 81 TRACE_EVENT0("renderer", "ChildSharedBitmapManager::FreeSharedMemory"); | |
| 82 sender_->Send(new ChildProcessHostMsg_DeletedSharedBitmap(bitmap->id())); | |
| 83 delete bitmap->memory(); | |
| 84 } | |
| 85 | |
| 86 void ChildSharedBitmapManager::ReleaseSharedBitmap(cc::SharedBitmap* handle) { | |
| 87 TRACE_EVENT0("renderer", "ChildSharedBitmapManager::ReleaseSharedBitmap"); | |
| 88 sender_->Send(new ChildProcessHostMsg_DeletedSharedBitmap(handle->id())); | |
| 89 } | 88 } |
| 90 | 89 |
| 91 } // namespace content | 90 } // namespace content |
| OLD | NEW |