1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/plugin_main.h"
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "build/build_config.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Need to include this before most other files because it defines
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// IPC_MESSAGE_LOG_ENABLED. We need to use it to define
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// IPC_MESSAGE_MACROS_LOG_ENABLED so ppapi_messages.h will generate the
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// ViewMsgLog et al. functions.
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/message_loop/message_loop.h"
14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/threading/thread.h"
15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ipc/ipc_logging.h"
16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/plugin_startup.h"
17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/ppapi_dispatcher.h"
18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/proxy/plugin_globals.h"
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/shared_impl/ppb_audio_shared.h"
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(__native_client__)
22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "native_client/src/shared/srpc/nacl_srpc.h"
23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid PpapiPluginRegisterThreadCreator(
26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const struct PP_ThreadFunctions* thread_functions) {
27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Initialize all classes that need to create threads that call back into
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // user code.
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ppapi::PPB_Audio_Shared::SetThreadFunctions(thread_functions);
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochint PpapiPluginMain() {
33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::MessageLoop loop;
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ppapi::proxy::PluginGlobals plugin_globals;
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(__native_client__)
37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Currently on non-SFI mode, we don't use SRPC server on plugin.
38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // TODO(hidehiko): Make sure this SRPC is actually used on SFI-mode.
39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Start up the SRPC server on another thread. Otherwise, when it blocks
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // on an RPC, the PPAPI proxy will hang. Do this before we initialize the
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // module and start the PPAPI proxy so that the NaCl plugin can continue
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // loading the app.
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  static struct NaClSrpcHandlerDesc srpc_methods[] = { { NULL, NULL } };
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!NaClSrpcAcceptClientOnThread(srpc_methods)) {
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return 1;
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ppapi::PpapiDispatcher ppapi_dispatcher(
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ppapi::GetIOThread()->message_loop_proxy(),
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ppapi::GetShutdownEvent(),
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ppapi::GetBrowserIPCFileDescriptor(),
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      ppapi::GetRendererIPCFileDescriptor());
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  plugin_globals.SetPluginProxyDelegate(&ppapi_dispatcher);
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  loop.Run();
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return 0;
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
61