Index: ppapi/proxy/plugin_main.cc |
diff --git a/ppapi/proxy/plugin_main_nacl.cc b/ppapi/proxy/plugin_main.cc |
similarity index 79% |
rename from ppapi/proxy/plugin_main_nacl.cc |
rename to ppapi/proxy/plugin_main.cc |
index a128f638ee5c1bfb6c572bf888655060b2296637..32cf71099b7b9929b988a08fc341d92a254ba2c6 100644 |
--- a/ppapi/proxy/plugin_main_nacl.cc |
+++ b/ppapi/proxy/plugin_main.cc |
@@ -11,16 +11,15 @@ |
// IPC_MESSAGE_MACROS_LOG_ENABLED so ppapi_messages.h will generate the |
// ViewMsgLog et al. functions. |
+#include "base/at_exit.h" |
#include "base/command_line.h" |
#include "base/message_loop/message_loop.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/synchronization/waitable_event.h" |
#include "base/threading/thread.h" |
-#include "components/tracing/child_trace_message_filter.h" |
#include "ipc/ipc_channel_handle.h" |
#include "ipc/ipc_logging.h" |
#include "ipc/ipc_message.h" |
-#include "native_client/src/shared/srpc/nacl_srpc.h" |
#include "native_client/src/untrusted/irt/irt_ppapi.h" |
#include "ppapi/c/ppp.h" |
#include "ppapi/c/ppp_instance.h" |
@@ -33,6 +32,11 @@ |
#include "ppapi/shared_impl/ppapi_switches.h" |
#include "ppapi/shared_impl/ppb_audio_shared.h" |
+#if defined(__native_client__) |
+#include "components/tracing/child_trace_message_filter.h" |
+#include "native_client/src/shared/srpc/nacl_srpc.h" |
+#endif |
+ |
#if defined(IPC_MESSAGE_LOG_ENABLED) |
#include "base/containers/hash_tables.h" |
@@ -45,16 +49,43 @@ LogFunctionMap g_log_function_mapping; |
#endif |
#include "ppapi/proxy/ppapi_messages.h" |
-// This must match up with NACL_CHROME_INITIAL_IPC_DESC, |
-// defined in sel_main_chrome.h |
-#define NACL_IPC_FD 6 |
- |
using ppapi::proxy::PluginDispatcher; |
using ppapi::proxy::PluginGlobals; |
using ppapi::proxy::PluginProxyDelegate; |
using ppapi::proxy::ProxyChannel; |
using ppapi::proxy::SerializedHandle; |
+namespace ppapi { |
+namespace proxy { |
+// This must match up with NACL_CHROME_INITIAL_IPC_DESC, |
+// defined in sel_main_chrome.h |
+int g_nacl_browser_ipc_fd = 6; |
+ |
+// This must match up with NACL_CHROME_RENDERER_INITIAL_IPC_DESC, |
+// defined in sel_main_chrome.h |
+int g_nacl_renderer_ipc_fd = 7; |
+ |
+base::WaitableEvent* g_ppapi_start_event = NULL; |
+ |
+// For non-SFI mode, the browser_ipc_fd and renderer_ipc_fd are different from |
+// the hard-coded numbers. So, this overwrites the values directly. |
+void SetIPCFileDescriptors(int browser_ipc_fd, int renderer_ipc_fd) { |
+ g_nacl_browser_ipc_fd = browser_ipc_fd; |
+ g_nacl_renderer_ipc_fd = renderer_ipc_fd; |
+} |
+ |
+// For non-SFI mode, we need to wait returning LoadModule SRPC until the |
+// MessageLoop on the plugin's main thread starts to run. This is the signal |
+// of the synchronization. Note that this setter must be called before the |
+// main thread starts, otherwise it would have a timing issue. |
+void SetPpapiStartEvent(base::WaitableEvent* ppapi_start_event) { |
+ DCHECK(g_ppapi_start_event == NULL); |
+ g_ppapi_start_event = ppapi_start_event; |
+} |
+ |
+} // namespace proxy |
+} // namespace ppapi |
+ |
namespace { |
// This class manages communication between the plugin and the browser, and |
@@ -110,15 +141,18 @@ PpapiDispatcher::PpapiDispatcher(scoped_refptr<base::MessageLoopProxy> io_loop) |
message_loop_(io_loop), |
shutdown_event_(true, false) { |
IPC::ChannelHandle channel_handle( |
- "NaCl IPC", base::FileDescriptor(NACL_IPC_FD, false)); |
+ "NaCl IPC", |
+ base::FileDescriptor(ppapi::proxy::g_nacl_browser_ipc_fd, false)); |
// We don't have/need a PID since handle sharing happens outside of the |
// NaCl sandbox. |
InitWithChannel(this, base::kNullProcessId, channel_handle, |
false); // Channel is server. |
channel()->AddFilter(new ppapi::proxy::PluginMessageFilter( |
NULL, PluginGlobals::Get()->resource_reply_thread_registrar())); |
+#if defined(__native_client__) |
channel()->AddFilter( |
new tracing::ChildTraceMessageFilter(message_loop_.get())); |
+#endif |
} |
base::MessageLoopProxy* PpapiDispatcher::GetIPCMessageLoop() { |
@@ -199,43 +233,7 @@ bool PpapiDispatcher::OnMessageReceived(const IPC::Message& msg) { |
void PpapiDispatcher::OnMsgCreateNaClChannel( |
const ppapi::PpapiNaClChannelArgs& args, |
SerializedHandle handle) { |
- static bool command_line_and_logging_initialized = false; |
- if (!command_line_and_logging_initialized) { |
- CommandLine::Init(0, NULL); |
- for (size_t i = 0; i < args.switch_names.size(); ++i) { |
- DCHECK(i < args.switch_values.size()); |
- CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
- args.switch_names[i], args.switch_values[i]); |
- } |
- logging::LoggingSettings settings; |
- settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; |
- logging::InitLogging(settings); |
- SetPpapiKeepAliveThrottleFromCommandLine(); |
- command_line_and_logging_initialized = true; |
- } |
- // Tell the process-global GetInterface which interfaces it can return to the |
- // plugin. |
- ppapi::proxy::InterfaceList::SetProcessGlobalPermissions( |
- args.permissions); |
- |
- int32_t error = ::PPP_InitializeModule( |
- 0 /* module */, |
- &ppapi::proxy::PluginDispatcher::GetBrowserInterface); |
- if (error) |
- ::exit(error); |
- |
- PluginDispatcher* dispatcher = |
- new PluginDispatcher(::PPP_GetInterface, args.permissions, |
- args.off_the_record); |
- // The channel handle's true name is not revealed here. |
- IPC::ChannelHandle channel_handle("nacl", handle.descriptor()); |
- if (!dispatcher->InitPluginWithChannel(this, base::kNullProcessId, |
- channel_handle, false)) { |
- delete dispatcher; |
- return; |
- } |
- // From here, the dispatcher will manage its own lifetime according to the |
- // lifetime of the attached channel. |
+ LOG(FATAL) << "OnMsgCreateNaClChannel"; |
} |
void PpapiDispatcher::OnPluginDispatcherMessageReceived( |
@@ -265,26 +263,47 @@ void PpapiDispatcher::SetPpapiKeepAliveThrottleFromCommandLine() { |
} |
} |
+void SetPpapiKeepAliveThrottleFromCommandLine() { |
+ unsigned keepalive_throttle_interval_milliseconds = 0; |
+ if (base::StringToUint( |
+ CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
+ switches::kPpapiKeepAliveThrottle), |
+ &keepalive_throttle_interval_milliseconds)) { |
+ ppapi::proxy::PluginGlobals::Get()-> |
+ set_keepalive_throttle_interval_milliseconds( |
+ keepalive_throttle_interval_milliseconds); |
+ } |
+} |
+ |
} // namespace |
void PpapiPluginRegisterThreadCreator( |
const struct PP_ThreadFunctions* thread_functions) { |
+#if defined(__native_client__) |
+ // Note: Currently, PPB_Audio_Shared::SetThreadFunctions is not available |
+ // on non-SFI mode, just because it is still under development. |
+ |
// Initialize all classes that need to create threads that call back into |
// user code. |
ppapi::PPB_Audio_Shared::SetThreadFunctions(thread_functions); |
+#endif |
} |
int PpapiPluginMain() { |
+ LOG(ERROR) << "PpapiPluginMain()"; |
// Though it isn't referenced here, we must instantiate an AtExitManager. |
base::AtExitManager exit_manager; |
base::MessageLoop loop; |
+#if defined(IPC_MESSAGE_LOG_ENABLED) |
IPC::Logging::set_log_function_map(&g_log_function_mapping); |
+#endif |
ppapi::proxy::PluginGlobals plugin_globals; |
base::Thread io_thread("Chrome_NaClIOThread"); |
base::Thread::Options options; |
options.message_loop_type = base::MessageLoop::TYPE_IO; |
io_thread.StartWithOptions(options); |
+#if defined(__native_client__) |
// Start up the SRPC server on another thread. Otherwise, when it blocks |
// on an RPC, the PPAPI proxy will hang. Do this before we initialize the |
// module and start the PPAPI proxy so that the NaCl plugin can continue |
@@ -293,10 +312,64 @@ int PpapiPluginMain() { |
if (!NaClSrpcAcceptClientOnThread(srpc_methods)) { |
return 1; |
} |
+#endif |
+ |
+ // TODO fix me. |
+ ppapi::PpapiNaClChannelArgs args; |
+ args.permissions = ppapi::PpapiPermissions(33); |
+ |
+ static bool command_line_and_logging_initialized = false; |
+ if (!command_line_and_logging_initialized) { |
+ CommandLine::Init(0, NULL); |
+ for (size_t i = 0; i < args.switch_names.size(); ++i) { |
+ DCHECK(i < args.switch_values.size()); |
+ CommandLine::ForCurrentProcess()->AppendSwitchASCII( |
+ args.switch_names[i], args.switch_values[i]); |
+ } |
+ logging::LoggingSettings settings; |
+ settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; |
+ logging::InitLogging(settings); |
+ SetPpapiKeepAliveThrottleFromCommandLine(); |
+ command_line_and_logging_initialized = true; |
+ } |
+ |
+ // Tell the process-global GetInterface which interfaces it can return to the |
+ // plugin. |
+ ppapi::proxy::InterfaceList::SetProcessGlobalPermissions( |
+ args.permissions); |
PpapiDispatcher ppapi_dispatcher(io_thread.message_loop_proxy()); |
plugin_globals.set_plugin_proxy_delegate(&ppapi_dispatcher); |
+ PluginDispatcher* plugin_dispatcher = |
+ new PluginDispatcher(::PPP_GetInterface, args.permissions, |
+ args.off_the_record); |
+ |
+ // The channel handle's true name is not revealed here. |
+ IPC::ChannelHandle channel_handle( |
+ "nacl", |
+ base::FileDescriptor(ppapi::proxy::g_nacl_renderer_ipc_fd, false)); |
+ if (!plugin_dispatcher->InitPluginWithChannel( |
+ &ppapi_dispatcher, base::kNullProcessId, |
+ channel_handle, false)) { |
+ delete plugin_dispatcher; |
+ return 1; |
+ } |
+ |
+ // From here, the dispatcher will manage its own lifetime according to the |
+ // lifetime of the attached channel. |
+ |
+ int32_t error = ::PPP_InitializeModule( |
+ 0 /* module */, |
+ &ppapi::proxy::PluginDispatcher::GetBrowserInterface); |
+ if (error) |
+ ::exit(error); |
+ |
+ if (ppapi::proxy::g_ppapi_start_event) { |
+ ppapi::proxy::g_ppapi_start_event->Signal(); |
+ ppapi::proxy::g_ppapi_start_event = NULL; |
+ } |
+ |
loop.Run(); |
return 0; |