forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplugin_startup.cc
132 lines (112 loc) · 4.46 KB
/
plugin_startup.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// Copyright 2014 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.
#include "ppapi/nacl_irt/plugin_startup.h"
#include "base/bind.h"
#include "base/check.h"
#include "base/file_descriptor_posix.h"
#include "base/location.h"
#include "base/message_loop/message_pump_type.h"
#include "base/single_thread_task_runner.h"
#include "base/synchronization/waitable_event.h"
#include "base/threading/thread.h"
#include "ipc/ipc_channel_handle.h"
#include "ppapi/nacl_irt/manifest_service.h"
#include "ppapi/shared_impl/ppb_audio_shared.h"
namespace ppapi {
namespace {
IPC::ChannelHandle* g_nacl_browser_ipc_handle = nullptr;
IPC::ChannelHandle* g_nacl_renderer_ipc_handle = nullptr;
IPC::ChannelHandle* g_manifest_service_handle = nullptr;
base::WaitableEvent* g_shutdown_event = NULL;
base::Thread* g_io_thread = NULL;
ManifestService* g_manifest_service = NULL;
bool IsValidChannelHandle(IPC::ChannelHandle* handle) {
// In SFI mode the underlying handle is wrapped by a NaClIPCAdapter, which is
// exposed as an FD. Otherwise, the handle is the underlying mojo message
// pipe.
return handle &&
#if defined(OS_NACL_SFI)
handle->socket.fd != -1;
#else
handle->is_mojo_channel_handle();
#endif
}
// Creates the manifest service on IO thread so that its Listener's thread and
// IO thread are shared. Upon completion of the manifest service creation,
// event is signaled.
void StartUpManifestServiceOnIOThread(base::WaitableEvent* event) {
// The start up must be called only once.
DCHECK(!g_manifest_service);
// manifest_service_handle must be set.
DCHECK(IsValidChannelHandle(g_manifest_service_handle));
// IOThread and shutdown event must be initialized in advance.
DCHECK(g_io_thread);
DCHECK(g_shutdown_event);
g_manifest_service = new ManifestService(
*g_manifest_service_handle, g_io_thread->task_runner(),
g_shutdown_event);
event->Signal();
}
} // namespace
void SetIPCChannelHandles(
IPC::ChannelHandle browser_ipc_handle,
IPC::ChannelHandle renderer_ipc_handle,
IPC::ChannelHandle manifest_service_handle) {
// The initialization must be only once.
DCHECK(!g_nacl_browser_ipc_handle);
DCHECK(!g_nacl_renderer_ipc_handle);
DCHECK(!g_nacl_renderer_ipc_handle);
g_nacl_browser_ipc_handle = new IPC::ChannelHandle(browser_ipc_handle);
g_nacl_renderer_ipc_handle = new IPC::ChannelHandle(renderer_ipc_handle);
g_manifest_service_handle = new IPC::ChannelHandle(manifest_service_handle);
}
void StartUpPlugin() {
// The start up must be called only once.
DCHECK(!g_shutdown_event);
DCHECK(!g_io_thread);
g_shutdown_event =
new base::WaitableEvent(base::WaitableEvent::ResetPolicy::MANUAL,
base::WaitableEvent::InitialState::NOT_SIGNALED);
g_io_thread = new base::Thread("Chrome_NaClIOThread");
g_io_thread->StartWithOptions(
base::Thread::Options(base::MessagePumpType::IO, 0));
if (IsValidChannelHandle(g_manifest_service_handle)) {
// Manifest service must be created on IOThread so that the main message
// handling will be done on the thread, which has a message loop
// even before irt_ppapi_start invocation.
// TODO(hidehiko,dmichael): This works, but is probably not well designed
// usage. Once a better approach is made, replace this by that way.
// (crbug.com/364241).
base::WaitableEvent event(base::WaitableEvent::ResetPolicy::MANUAL,
base::WaitableEvent::InitialState::NOT_SIGNALED);
g_io_thread->task_runner()->PostTask(
FROM_HERE, base::BindOnce(StartUpManifestServiceOnIOThread, &event));
event.Wait();
}
PPB_Audio_Shared::SetNaClMode();
}
IPC::ChannelHandle GetBrowserIPCChannelHandle() {
// The handle must be initialized in advance.
DCHECK(IsValidChannelHandle(g_nacl_browser_ipc_handle));
return *g_nacl_browser_ipc_handle;
}
IPC::ChannelHandle GetRendererIPCChannelHandle() {
// The handle must be initialized in advance.
DCHECK(IsValidChannelHandle(g_nacl_renderer_ipc_handle));
return *g_nacl_renderer_ipc_handle;
}
base::WaitableEvent* GetShutdownEvent() {
// The shutdown event must be initialized in advance.
DCHECK(g_shutdown_event);
return g_shutdown_event;
}
base::Thread* GetIOThread() {
// The IOThread must be initialized in advance.
DCHECK(g_io_thread);
return g_io_thread;
}
ManifestService* GetManifestService() {
return g_manifest_service;
}
} // namespace ppapi