1 // Copyright (c) 2012 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. 4 5 #include "content/renderer/pepper/host_array_buffer_var.h" 6 7 #include <stdio.h> 8 #include <string.h> 9 10 #include "base/logging.h" 11 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/shared_memory.h" 13 #include "base/process/process_handle.h" 14 #include "content/common/sandbox_util.h" 15 #include "content/renderer/pepper/host_globals.h" 16 #include "content/renderer/pepper/plugin_module.h" 17 #include "content/renderer/render_thread_impl.h" 18 #include "ppapi/c/pp_instance.h" 19 20 using ppapi::ArrayBufferVar; 21 using blink::WebArrayBuffer; 22 23 namespace content { 24 25 HostArrayBufferVar::HostArrayBufferVar(uint32 size_in_bytes) 26 : buffer_(WebArrayBuffer::create(size_in_bytes, 1 /* element_size */)), 27 valid_(true) { 28 } 29 30 HostArrayBufferVar::HostArrayBufferVar(const WebArrayBuffer& buffer) 31 : buffer_(buffer), 32 valid_(true) { 33 } 34 35 HostArrayBufferVar::HostArrayBufferVar(uint32 size_in_bytes, 36 base::SharedMemoryHandle handle) 37 : buffer_(WebArrayBuffer::create(size_in_bytes, 1 /* element_size */)) { 38 base::SharedMemory s(handle, true); 39 valid_ = s.Map(size_in_bytes); 40 if (valid_) { 41 memcpy(buffer_.data(), s.memory(), size_in_bytes); 42 s.Unmap(); 43 } 44 } 45 46 HostArrayBufferVar::~HostArrayBufferVar() { 47 } 48 49 void* HostArrayBufferVar::Map() { 50 if (!valid_) 51 return NULL; 52 return buffer_.data(); 53 } 54 55 void HostArrayBufferVar::Unmap() { 56 // We do not used shared memory on the host side. Nothing to do. 57 } 58 59 uint32 HostArrayBufferVar::ByteLength() { 60 return buffer_.byteLength(); 61 } 62 63 bool HostArrayBufferVar::CopyToNewShmem( 64 PP_Instance instance, 65 int* host_shm_handle_id, 66 base::SharedMemoryHandle* plugin_shm_handle) { 67 scoped_ptr<base::SharedMemory> shm( 68 RenderThread::Get()->HostAllocateSharedMemoryBuffer(ByteLength()). 69 release()); 70 if (!shm) 71 return false; 72 73 shm->Map(ByteLength()); 74 memcpy(shm->memory(), Map(), ByteLength()); 75 shm->Unmap(); 76 77 // Duplicate the handle here; the SharedMemory destructor closes 78 // its handle on us. 79 HostGlobals* hg = HostGlobals::Get(); 80 PluginModule* pm = hg->GetModule(hg->GetModuleForInstance(instance)); 81 base::ProcessId p = pm->GetPeerProcessId(); 82 if (p == base::kNullProcessId) { 83 // In-process, clone for ourselves. 84 p = base::GetCurrentProcId(); 85 } 86 87 base::PlatformFile platform_file = 88 #if defined(OS_WIN) 89 shm->handle(); 90 #elif defined(OS_POSIX) 91 shm->handle().fd; 92 #else 93 #error Not implemented. 94 #endif 95 96 *plugin_shm_handle = BrokerGetFileHandleForProcess(platform_file, p, false); 97 *host_shm_handle_id = -1; 98 return true; 99 } 100 101 } // namespace content 102