summaryrefslogtreecommitdiffstats
path: root/ppapi/proxy
diff options
context:
space:
mode:
authorfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-10 02:30:00 +0000
committerfischman@chromium.org <fischman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-10 02:30:00 +0000
commit32523380fc0111a95540f5a860184d8917270375 (patch)
tree19fad940c6817d50ea5ff68aab42fb504893fa6e /ppapi/proxy
parent2e7617c01514a05eb6c3db651259701131e3b85a (diff)
downloadchromium_src-32523380fc0111a95540f5a860184d8917270375.zip
chromium_src-32523380fc0111a95540f5a860184d8917270375.tar.gz
chromium_src-32523380fc0111a95540f5a860184d8917270375.tar.bz2
Implement out-of-process proxy for PPB_Buffer_Dev.
BUG=85427,85441 TEST=./ninja/ui_tests --gtest_filter=*PPAPITest.Buffer Review URL: http://codereview.chromium.org/7108051 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@88630 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ppapi/proxy')
-rw-r--r--ppapi/proxy/ppapi_messages.h3
-rw-r--r--ppapi/proxy/ppb_buffer_proxy.cc71
-rw-r--r--ppapi/proxy/ppb_buffer_proxy.h5
3 files changed, 54 insertions, 25 deletions
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h
index 49f0045..7ceb936 100644
--- a/ppapi/proxy/ppapi_messages.h
+++ b/ppapi/proxy/ppapi_messages.h
@@ -289,7 +289,7 @@ IPC_SYNC_MESSAGE_ROUTED2_2(PpapiHostMsg_PPBBuffer_Create,
PP_Instance /* instance */,
uint32_t /* size */,
pp::proxy::HostResource /* result_resource */,
- int32_t /* result_shm_handle */)
+ base::SharedMemoryHandle /* result_shm_handle */)
// PPB_Console.
IPC_MESSAGE_ROUTED3(PpapiHostMsg_PPBConsole_Log,
@@ -789,4 +789,3 @@ IPC_SYNC_MESSAGE_ROUTED4_3(PpapiHostMsg_ResourceCreation_ImageData,
pp::proxy::HostResource /* result_resource */,
std::string /* image_data_desc */,
pp::proxy::ImageHandle /* result */)
-
diff --git a/ppapi/proxy/ppb_buffer_proxy.cc b/ppapi/proxy/ppb_buffer_proxy.cc
index 5c2fd8a..a358de7 100644
--- a/ppapi/proxy/ppb_buffer_proxy.cc
+++ b/ppapi/proxy/ppb_buffer_proxy.cc
@@ -9,12 +9,16 @@
#include "base/logging.h"
#include "build/build_config.h"
#include "ppapi/c/pp_completion_callback.h"
+#include "ppapi/c/pp_errors.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/dev/ppb_buffer_dev.h"
+#include "ppapi/proxy/host_dispatcher.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/plugin_resource.h"
#include "ppapi/proxy/ppapi_messages.h"
+#include "ppapi/thunk/enter.h"
#include "ppapi/thunk/ppb_buffer_api.h"
+#include "ppapi/thunk/ppb_buffer_trusted_api.h"
#include "ppapi/thunk/thunk.h"
namespace pp {
@@ -33,7 +37,7 @@ class Buffer : public ppapi::thunk::PPB_Buffer_API,
public PluginResource {
public:
Buffer(const HostResource& resource,
- int memory_handle,
+ const base::SharedMemoryHandle& shm_handle,
uint32_t size);
virtual ~Buffer();
@@ -50,19 +54,18 @@ class Buffer : public ppapi::thunk::PPB_Buffer_API,
virtual void Unmap() OVERRIDE;
private:
- int memory_handle_;
+ base::SharedMemory shm_;
uint32_t size_;
-
void* mapped_data_;
DISALLOW_COPY_AND_ASSIGN(Buffer);
};
Buffer::Buffer(const HostResource& resource,
- int memory_handle,
+ const base::SharedMemoryHandle& shm_handle,
uint32_t size)
: PluginResource(resource),
- memory_handle_(memory_handle),
+ shm_(shm_handle, false),
size_(size),
mapped_data_(NULL) {
}
@@ -89,12 +92,13 @@ PP_Bool Buffer::IsMapped() {
}
void* Buffer::Map() {
- // TODO(brettw) implement this.
- return mapped_data_;
+ if (!shm_.memory())
+ shm_.Map(size_);
+ return shm_.memory();
}
void Buffer::Unmap() {
- // TODO(brettw) implement this.
+ shm_.Unmap();
}
PPB_Buffer_Proxy::PPB_Buffer_Proxy(Dispatcher* dispatcher,
@@ -125,15 +129,14 @@ PP_Resource PPB_Buffer_Proxy::CreateProxyResource(PP_Instance instance,
return 0;
HostResource result;
- int32_t shm_handle = -1;
+ base::SharedMemoryHandle shm_handle = base::SharedMemory::NULLHandle();
dispatcher->Send(new PpapiHostMsg_PPBBuffer_Create(
INTERFACE_ID_PPB_BUFFER, instance, size,
&result, &shm_handle));
- if (result.is_null())
+ if (result.is_null() || !base::SharedMemory::IsHandleValid(shm_handle))
return 0;
- linked_ptr<Buffer> object(new Buffer(result,
- static_cast<int>(shm_handle), size));
+ linked_ptr<Buffer> object(new Buffer(result, shm_handle, size));
return PluginResourceTracker::GetInstance()->AddResource(object);
}
@@ -147,15 +150,41 @@ bool PPB_Buffer_Proxy::OnMessageReceived(const IPC::Message& msg) {
return handled;
}
-void PPB_Buffer_Proxy::OnMsgCreate(PP_Instance instance,
- uint32_t size,
- HostResource* result_resource,
- int* result_shm_handle) {
- result_resource->SetHostResource(
- instance,
- ppb_buffer_target()->Create(instance, size));
- // TODO(brettw) set the shm handle from a trusted interface.
- *result_shm_handle = 0;
+void PPB_Buffer_Proxy::OnMsgCreate(
+ PP_Instance instance,
+ uint32_t size,
+ HostResource* result_resource,
+ base::SharedMemoryHandle* result_shm_handle) {
+ // Overwritten below on success.
+ *result_shm_handle = base::SharedMemory::NULLHandle();
+ HostDispatcher* dispatcher = HostDispatcher::GetForInstance(instance);
+ if (!dispatcher)
+ return;
+ PP_Resource local_buffer_resource =
+ ppb_buffer_target()->Create(instance, size);
+ if (local_buffer_resource == 0)
+ return;
+ ::ppapi::thunk::EnterResourceNoLock< ::ppapi::thunk::PPB_BufferTrusted_API>
+ trusted_buffer(local_buffer_resource, false);
+ if (trusted_buffer.failed())
+ return;
+ int local_fd;
+ if (trusted_buffer.object()->GetSharedMemory(&local_fd) != PP_OK)
+ return;
+
+ result_resource->SetHostResource(instance, local_buffer_resource);
+
+ // TODO(piman/brettw): Change trusted interface to return a PP_FileHandle,
+ // those casts are ugly.
+ base::PlatformFile platform_file =
+#if defined(OS_WIN)
+ reinterpret_cast<HANDLE>(static_cast<intptr_t>(local_fd));
+#elif defined(OS_POSIX)
+ local_fd;
+#else
+ #error Not implemented.
+#endif
+ *result_shm_handle = dispatcher->ShareHandleWithRemote(platform_file, false);
}
} // namespace proxy
diff --git a/ppapi/proxy/ppb_buffer_proxy.h b/ppapi/proxy/ppb_buffer_proxy.h
index 752ab8a..6002950 100644
--- a/ppapi/proxy/ppb_buffer_proxy.h
+++ b/ppapi/proxy/ppb_buffer_proxy.h
@@ -1,10 +1,11 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef PPAPI_PPB_BUFFER_PROXY_H_
#define PPAPI_PPB_BUFFER_PROXY_H_
+#include "base/shared_memory.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/proxy/interface_proxy.h"
@@ -37,7 +38,7 @@ class PPB_Buffer_Proxy : public InterfaceProxy {
void OnMsgCreate(PP_Instance instance,
uint32_t size,
HostResource* result_resource,
- int* result_shm_handle);
+ base::SharedMemoryHandle* result_shm_handle);
};
} // namespace proxy