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

Unified Diff: chrome/ppapi_plugin/ppapi_thread.cc

Issue 6486034: Share PPAPI out-of-process plugins between renderer processes.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/ppapi_plugin/ppapi_thread.h ('k') | chrome/renderer/pepper_plugin_delegate_impl.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/ppapi_plugin/ppapi_thread.cc
===================================================================
--- chrome/ppapi_plugin/ppapi_thread.cc (revision 74733)
+++ chrome/ppapi_plugin/ppapi_thread.cc (working copy)
@@ -4,27 +4,33 @@
#include "chrome/ppapi_plugin/ppapi_thread.h"
+#include <limits>
+
#include "base/process_util.h"
+#include "base/rand_util.h"
#include "chrome/common/child_process.h"
#include "ipc/ipc_channel_handle.h"
#include "ipc/ipc_sync_channel.h"
+#include "ppapi/c/pp_errors.h"
#include "ppapi/c/ppp.h"
#include "ppapi/proxy/plugin_dispatcher.h"
#include "ppapi/proxy/ppapi_messages.h"
-#if defined(OS_POSIX)
-#include "base/eintr_wrapper.h"
-#include "ipc/ipc_channel_posix.h"
-#endif
-
PpapiThread::PpapiThread()
-#if defined(OS_POSIX)
- : renderer_fd_(-1)
-#endif
- {
+ : get_plugin_interface_(NULL),
+ local_pp_module_(
+ base::RandInt(0, std::numeric_limits<PP_Module>::max())) {
}
PpapiThread::~PpapiThread() {
+ if (library_.is_valid()) {
+ // The ShutdownModule function is optional.
+ pp::proxy::Dispatcher::ShutdownModuleFunc shutdown_module =
+ reinterpret_cast<pp::proxy::Dispatcher::ShutdownModuleFunc>(
+ library_.GetFunctionPointer("PPP_ShutdownModule"));
+ if (shutdown_module)
+ shutdown_module();
+ }
}
// The "regular" ChildThread implements this function and does some standard
@@ -37,37 +43,23 @@
bool PpapiThread::OnMessageReceived(const IPC::Message& msg) {
IPC_BEGIN_MESSAGE_MAP(PpapiThread, msg)
IPC_MESSAGE_HANDLER(PpapiMsg_LoadPlugin, OnMsgLoadPlugin)
+ IPC_MESSAGE_HANDLER(PpapiMsg_CreateChannel, OnMsgCreateChannel)
IPC_END_MESSAGE_MAP()
return true;
}
-void PpapiThread::OnMsgLoadPlugin(base::ProcessHandle host_process_handle,
- const FilePath& path,
- int renderer_id) {
- IPC::ChannelHandle channel_handle;
- if (!LoadPluginLib(host_process_handle, path) ||
- !SetupRendererChannel(renderer_id, &channel_handle)) {
- // An empty channel handle indicates error.
- Send(new PpapiHostMsg_PluginLoaded(IPC::ChannelHandle()));
- return;
- }
-
- Send(new PpapiHostMsg_PluginLoaded(channel_handle));
-}
-
-bool PpapiThread::LoadPluginLib(base::ProcessHandle host_process_handle,
- const FilePath& path) {
+void PpapiThread::OnMsgLoadPlugin(const FilePath& path) {
base::ScopedNativeLibrary library(base::LoadNativeLibrary(path));
if (!library.is_valid())
- return false;
+ return;
// Get the GetInterface function (required).
- pp::proxy::Dispatcher::GetInterfaceFunc get_interface =
+ get_plugin_interface_ =
reinterpret_cast<pp::proxy::Dispatcher::GetInterfaceFunc>(
library.GetFunctionPointer("PPP_GetInterface"));
- if (!get_interface) {
+ if (!get_plugin_interface_) {
LOG(WARNING) << "No PPP_GetInterface in plugin library";
- return false;
+ return;
}
// Get the InitializeModule function (required).
@@ -76,26 +68,42 @@
library.GetFunctionPointer("PPP_InitializeModule"));
if (!init_module) {
LOG(WARNING) << "No PPP_InitializeModule in plugin library";
- return false;
+ return;
}
+ int32_t init_error = init_module(
+ local_pp_module_,
+ &pp::proxy::PluginDispatcher::GetInterfaceFromDispatcher);
+ if (init_error != PP_OK) {
+ LOG(WARNING) << "InitModule failed with error " << init_error;
+ return;
+ }
- // Get the ShutdownModule function (optional).
- pp::proxy::Dispatcher::ShutdownModuleFunc shutdown_module =
- reinterpret_cast<pp::proxy::Dispatcher::ShutdownModuleFunc>(
- library.GetFunctionPointer("PPP_ShutdownModule"));
-
library_.Reset(library.Release());
- dispatcher_.reset(new pp::proxy::PluginDispatcher(
- host_process_handle, get_interface, init_module, shutdown_module));
- return true;
}
-bool PpapiThread::SetupRendererChannel(int renderer_id,
+void PpapiThread::OnMsgCreateChannel(base::ProcessHandle host_process_handle,
+ int renderer_id) {
+ IPC::ChannelHandle channel_handle;
+ if (!library_.is_valid() || // Plugin couldn't be loaded.
+ !SetupRendererChannel(host_process_handle, renderer_id,
+ &channel_handle)) {
+ Send(new PpapiHostMsg_ChannelCreated(IPC::ChannelHandle()));
+ return;
+ }
+
+ Send(new PpapiHostMsg_ChannelCreated(channel_handle));
+}
+
+bool PpapiThread::SetupRendererChannel(base::ProcessHandle host_process_handle,
+ int renderer_id,
IPC::ChannelHandle* handle) {
+ pp::proxy::PluginDispatcher* dispatcher = new pp::proxy::PluginDispatcher(
+ host_process_handle, get_plugin_interface_);
+
IPC::ChannelHandle plugin_handle;
plugin_handle.name = StringPrintf("%d.r%d", base::GetCurrentProcId(),
renderer_id);
- if (!dispatcher_->InitWithChannel(
+ if (!dispatcher->InitWithChannel(
ChildProcess::current()->io_message_loop(),
plugin_handle, false,
ChildProcess::current()->GetShutDownEvent()))
@@ -104,18 +112,9 @@
handle->name = plugin_handle.name;
#if defined(OS_POSIX)
// On POSIX, pass the renderer-side FD.
- renderer_fd_ = dispatcher_->channel()->GetClientFileDescriptor();
- handle->socket = base::FileDescriptor(renderer_fd_, false);
+ handle->socket = base::FileDescriptor(dispatcher->GetRendererFD(), false);
#endif
+
return true;
}
-#if defined(OS_POSIX)
-void PpapiThread::CloseRendererFD() {
- if (renderer_fd_ != -1) {
- if (HANDLE_EINTR(close(renderer_fd_)) < 0)
- PLOG(ERROR) << "close";
- renderer_fd_ = -1;
- }
-}
-#endif
« no previous file with comments | « chrome/ppapi_plugin/ppapi_thread.h ('k') | chrome/renderer/pepper_plugin_delegate_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698