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 |