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
3 // found in the LICENSE file.
5 #include "content/child/child_shared_bitmap_manager.h"
7 #include "content/child/child_thread.h"
8 #include "content/common/child_process_messages.h"
9 #include "ui/gfx/size.h"
13 ChildSharedBitmapManager::ChildSharedBitmapManager(
14 scoped_refptr
<ThreadSafeSender
> sender
)
17 ChildSharedBitmapManager::~ChildSharedBitmapManager() {}
19 scoped_ptr
<cc::SharedBitmap
> ChildSharedBitmapManager::AllocateSharedBitmap(
20 const gfx::Size
& size
) {
21 TRACE_EVENT2("renderer",
22 "ChildSharedBitmapManager::AllocateSharedMemory",
28 if (!cc::SharedBitmap::SizeInBytes(size
, &memory_size
))
29 return scoped_ptr
<cc::SharedBitmap
>();
30 cc::SharedBitmapId id
= cc::SharedBitmap::GenerateId();
31 scoped_ptr
<base::SharedMemory
> memory
;
33 base::SharedMemoryHandle handle
;
34 sender_
->Send(new ChildProcessHostMsg_SyncAllocateSharedBitmap(
35 memory_size
, id
, &handle
));
36 memory
= make_scoped_ptr(new base::SharedMemory(handle
, false));
37 CHECK(memory
->Map(memory_size
));
39 memory
.reset(ChildThread::AllocateSharedMemory(memory_size
, sender_
));
41 base::SharedMemoryHandle handle_to_send
= memory
->handle();
42 sender_
->Send(new ChildProcessHostMsg_AllocatedSharedBitmap(
43 memory_size
, handle_to_send
, id
));
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(
50 base::Bind(&ChildSharedBitmapManager::FreeSharedMemory
,
51 base::Unretained(this))));
54 scoped_ptr
<cc::SharedBitmap
> ChildSharedBitmapManager::GetSharedBitmapFromId(
56 const cc::SharedBitmapId
&) {
58 return scoped_ptr
<cc::SharedBitmap
>();
61 scoped_ptr
<cc::SharedBitmap
> ChildSharedBitmapManager::GetBitmapForSharedMemory(
62 base::SharedMemory
* mem
) {
63 cc::SharedBitmapId id
= cc::SharedBitmap::GenerateId();
64 base::SharedMemoryHandle handle_to_send
= mem
->handle();
66 if (!mem
->ShareToProcess(base::GetCurrentProcessHandle(), &handle_to_send
))
67 return scoped_ptr
<cc::SharedBitmap
>();
69 sender_
->Send(new ChildProcessHostMsg_AllocatedSharedBitmap(
70 mem
->mapped_size(), handle_to_send
, id
));
71 // The compositor owning the SharedBitmap will be closed before the
72 // ChildThread containng this, making the use of base::Unretained safe.
73 return scoped_ptr
<cc::SharedBitmap
>(new cc::SharedBitmap(
76 base::Bind(&ChildSharedBitmapManager::ReleaseSharedBitmap
,
77 base::Unretained(this))));
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();
86 void ChildSharedBitmapManager::ReleaseSharedBitmap(cc::SharedBitmap
* handle
) {
87 TRACE_EVENT0("renderer", "ChildSharedBitmapManager::ReleaseSharedBitmap");
88 sender_
->Send(new ChildProcessHostMsg_DeletedSharedBitmap(handle
->id()));
91 } // namespace content