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

Unified Diff: ppapi/proxy/plugin_dispatcher.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 | « ppapi/proxy/plugin_dispatcher.h ('k') | ppapi/proxy/ppapi_messages_internal.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ppapi/proxy/plugin_dispatcher.cc
===================================================================
--- ppapi/proxy/plugin_dispatcher.cc (revision 74733)
+++ ppapi/proxy/plugin_dispatcher.cc (working copy)
@@ -1,4 +1,4 @@
-// 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.
@@ -16,6 +16,11 @@
#include "ppapi/proxy/ppapi_messages.h"
#include "ppapi/proxy/ppp_class_proxy.h"
+#if defined(OS_POSIX)
+#include "base/eintr_wrapper.h"
+#include "ipc/ipc_channel_posix.h"
+#endif
+
namespace pp {
namespace proxy {
@@ -24,23 +29,15 @@
typedef std::map<PP_Instance, PluginDispatcher*> InstanceToDispatcherMap;
InstanceToDispatcherMap* g_instance_to_dispatcher = NULL;
-const void* GetInterfaceFromDispatcher(const char* interface) {
- // All interfaces the plugin requests of the browser are "PPB".
- const InterfaceProxy::Info* info = Dispatcher::GetPPBInterfaceInfo(interface);
- if (!info)
- return NULL;
- return info->interface;
-}
-
} // namespace
PluginDispatcher::PluginDispatcher(base::ProcessHandle remote_process_handle,
- GetInterfaceFunc get_interface,
- InitModuleFunc init_module,
- ShutdownModuleFunc shutdown_module)
- : Dispatcher(remote_process_handle, get_interface),
- init_module_(init_module),
- shutdown_module_(shutdown_module) {
+ GetInterfaceFunc get_interface)
+ : Dispatcher(remote_process_handle, get_interface)
+#if defined(OS_POSIX)
+ , renderer_fd_(-1)
+#endif
+ {
SetSerializationRules(new PluginVarSerializationRules);
// As a plugin, we always support the PPP_Class interface. There's no
@@ -49,8 +46,9 @@
}
PluginDispatcher::~PluginDispatcher() {
- if (shutdown_module_)
- shutdown_module_();
+#if defined(OS_POSIX)
+ CloseRendererFD();
+#endif
}
// static
@@ -64,6 +62,16 @@
return found->second;
}
+// static
+const void* PluginDispatcher::GetInterfaceFromDispatcher(
+ const char* interface) {
+ // All interfaces the plugin requests of the browser are "PPB".
+ const InterfaceProxy::Info* info = GetPPBInterfaceInfo(interface);
+ if (!info)
+ return NULL;
+ return info->interface;
+}
+
bool PluginDispatcher::IsPlugin() const {
return true;
}
@@ -78,8 +86,6 @@
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(PluginDispatcher, msg)
IPC_MESSAGE_HANDLER(PpapiMsg_SupportsInterface, OnMsgSupportsInterface)
- IPC_MESSAGE_HANDLER(PpapiMsg_InitializeModule, OnMsgInitializeModule)
- IPC_MESSAGE_HANDLER(PpapiMsg_Shutdown, OnMsgShutdown)
IPC_END_MESSAGE_MAP()
return handled;
}
@@ -122,6 +128,14 @@
return proxy->OnMessageReceived(msg);
}
+void PluginDispatcher::OnChannelError() {
+ // The renderer has crashed. This channel and all instances associated with
+ // it are no longer valid.
+ ForceFreeAllInstances();
+ // TODO(brettw) free resources too!
+ delete this;
+}
+
void PluginDispatcher::DidCreateInstance(PP_Instance instance) {
if (!g_instance_to_dispatcher)
g_instance_to_dispatcher = new InstanceToDispatcherMap;
@@ -152,18 +166,26 @@
return (it == instance_map_.end()) ? NULL : &it->second;
}
-void PluginDispatcher::OnMsgInitializeModule(PP_Module pp_module,
- bool* result) {
- set_pp_module(pp_module);
- *result = init_module_(pp_module, &GetInterfaceFromDispatcher) == PP_OK;
+#if defined(OS_POSIX)
+int PluginDispatcher::GetRendererFD() {
+ if (renderer_fd_ == -1)
+ renderer_fd_ = channel()->GetClientFileDescriptor();
+ return renderer_fd_;
}
-void PluginDispatcher::OnMsgShutdown() {
- if (shutdown_module_)
- shutdown_module_();
- MessageLoop::current()->Quit();
+void PluginDispatcher::CloseRendererFD() {
+ if (renderer_fd_ != -1) {
+ if (HANDLE_EINTR(close(renderer_fd_)) < 0)
+ PLOG(ERROR) << "close";
+ renderer_fd_ = -1;
+ }
}
+#endif
+void PluginDispatcher::ForceFreeAllInstances() {
+ // TODO(brettw) implement freeing instances on crash.
+}
+
void PluginDispatcher::OnMsgSupportsInterface(
const std::string& interface_name,
bool* result) {
« no previous file with comments | « ppapi/proxy/plugin_dispatcher.h ('k') | ppapi/proxy/ppapi_messages_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698