1*635a8641SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "mojo/public/c/system/thunks.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <cstddef>
8*635a8641SAndroid Build Coastguard Worker #include <cstdint>
9*635a8641SAndroid Build Coastguard Worker #include <cstring>
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/memory/protected_memory.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/memory/protected_memory_cfi.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/no_destructor.h"
16*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
17*635a8641SAndroid Build Coastguard Worker #include "mojo/public/c/system/core.h"
18*635a8641SAndroid Build Coastguard Worker
19*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
20*635a8641SAndroid Build Coastguard Worker #include "base/environment.h"
21*635a8641SAndroid Build Coastguard Worker #include "base/files/file_path.h"
22*635a8641SAndroid Build Coastguard Worker #include "base/optional.h"
23*635a8641SAndroid Build Coastguard Worker #include "base/scoped_native_library.h"
24*635a8641SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h"
25*635a8641SAndroid Build Coastguard Worker #endif
26*635a8641SAndroid Build Coastguard Worker
27*635a8641SAndroid Build Coastguard Worker namespace {
28*635a8641SAndroid Build Coastguard Worker
29*635a8641SAndroid Build Coastguard Worker typedef void (*MojoGetSystemThunksFunction)(MojoSystemThunks* thunks);
30*635a8641SAndroid Build Coastguard Worker
31*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
32*635a8641SAndroid Build Coastguard Worker PROTECTED_MEMORY_SECTION
33*635a8641SAndroid Build Coastguard Worker base::ProtectedMemory<MojoGetSystemThunksFunction> g_get_thunks;
34*635a8641SAndroid Build Coastguard Worker #endif
35*635a8641SAndroid Build Coastguard Worker
36*635a8641SAndroid Build Coastguard Worker PROTECTED_MEMORY_SECTION base::ProtectedMemory<MojoSystemThunks> g_thunks;
37*635a8641SAndroid Build Coastguard Worker
NotImplemented(const char * name)38*635a8641SAndroid Build Coastguard Worker MojoResult NotImplemented(const char* name) {
39*635a8641SAndroid Build Coastguard Worker DLOG(ERROR) << "Function 'Mojo" << name
40*635a8641SAndroid Build Coastguard Worker << "()' not supported in this version of Mojo Core.";
41*635a8641SAndroid Build Coastguard Worker return MOJO_RESULT_UNIMPLEMENTED;
42*635a8641SAndroid Build Coastguard Worker }
43*635a8641SAndroid Build Coastguard Worker
44*635a8641SAndroid Build Coastguard Worker } // namespace
45*635a8641SAndroid Build Coastguard Worker
46*635a8641SAndroid Build Coastguard Worker // Macro to verify that the thunk symbol |name| is actually present in the
47*635a8641SAndroid Build Coastguard Worker // runtime version of Mojo Core that is currently in use.
48*635a8641SAndroid Build Coastguard Worker #define FUNCTION_IS_IMPLEMENTED(name) \
49*635a8641SAndroid Build Coastguard Worker (reinterpret_cast<uintptr_t>(static_cast<const void*>(&g_thunks->name)) - \
50*635a8641SAndroid Build Coastguard Worker reinterpret_cast<uintptr_t>(static_cast<const void*>(&g_thunks)) < \
51*635a8641SAndroid Build Coastguard Worker g_thunks->size)
52*635a8641SAndroid Build Coastguard Worker
53*635a8641SAndroid Build Coastguard Worker #define INVOKE_THUNK(name, ...) \
54*635a8641SAndroid Build Coastguard Worker FUNCTION_IS_IMPLEMENTED(name) \
55*635a8641SAndroid Build Coastguard Worker ? base::UnsanitizedCfiCall(g_thunks, &MojoSystemThunks::name)(__VA_ARGS__) \
56*635a8641SAndroid Build Coastguard Worker : NotImplemented(#name)
57*635a8641SAndroid Build Coastguard Worker
58*635a8641SAndroid Build Coastguard Worker namespace mojo {
59*635a8641SAndroid Build Coastguard Worker
60*635a8641SAndroid Build Coastguard Worker // NOTE: This is defined within the global mojo namespace so that it can be
61*635a8641SAndroid Build Coastguard Worker // referenced as a friend to base::ScopedAllowBlocking when library support is
62*635a8641SAndroid Build Coastguard Worker // enabled.
63*635a8641SAndroid Build Coastguard Worker class CoreLibraryInitializer {
64*635a8641SAndroid Build Coastguard Worker public:
CoreLibraryInitializer(const MojoInitializeOptions * options)65*635a8641SAndroid Build Coastguard Worker CoreLibraryInitializer(const MojoInitializeOptions* options) {
66*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
67*635a8641SAndroid Build Coastguard Worker bool application_provided_path = false;
68*635a8641SAndroid Build Coastguard Worker base::Optional<base::FilePath> library_path;
69*635a8641SAndroid Build Coastguard Worker if (options && options->struct_size >= sizeof(*options) &&
70*635a8641SAndroid Build Coastguard Worker options->mojo_core_path) {
71*635a8641SAndroid Build Coastguard Worker base::StringPiece utf8_path(options->mojo_core_path,
72*635a8641SAndroid Build Coastguard Worker options->mojo_core_path_length);
73*635a8641SAndroid Build Coastguard Worker library_path.emplace(base::FilePath::FromUTF8Unsafe(utf8_path));
74*635a8641SAndroid Build Coastguard Worker application_provided_path = true;
75*635a8641SAndroid Build Coastguard Worker } else {
76*635a8641SAndroid Build Coastguard Worker auto environment = base::Environment::Create();
77*635a8641SAndroid Build Coastguard Worker std::string library_path_value;
78*635a8641SAndroid Build Coastguard Worker const char kLibraryPathEnvironmentVar[] = "MOJO_CORE_LIBRARY_PATH";
79*635a8641SAndroid Build Coastguard Worker if (environment->GetVar(kLibraryPathEnvironmentVar, &library_path_value))
80*635a8641SAndroid Build Coastguard Worker library_path = base::FilePath::FromUTF8Unsafe(library_path_value);
81*635a8641SAndroid Build Coastguard Worker }
82*635a8641SAndroid Build Coastguard Worker
83*635a8641SAndroid Build Coastguard Worker if (!library_path) {
84*635a8641SAndroid Build Coastguard Worker // Default to looking for the library in the current working directory.
85*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS) || defined(OS_LINUX)
86*635a8641SAndroid Build Coastguard Worker const base::FilePath::CharType kDefaultLibraryPathValue[] =
87*635a8641SAndroid Build Coastguard Worker FILE_PATH_LITERAL("./libmojo_core.so");
88*635a8641SAndroid Build Coastguard Worker #elif defined(OS_WIN)
89*635a8641SAndroid Build Coastguard Worker const base::FilePath::CharType kDefaultLibraryPathValue[] =
90*635a8641SAndroid Build Coastguard Worker FILE_PATH_LITERAL("mojo_core.dll");
91*635a8641SAndroid Build Coastguard Worker #endif
92*635a8641SAndroid Build Coastguard Worker library_path.emplace(kDefaultLibraryPathValue);
93*635a8641SAndroid Build Coastguard Worker }
94*635a8641SAndroid Build Coastguard Worker
95*635a8641SAndroid Build Coastguard Worker base::ScopedAllowBlocking allow_blocking;
96*635a8641SAndroid Build Coastguard Worker library_.emplace(*library_path);
97*635a8641SAndroid Build Coastguard Worker if (!application_provided_path) {
98*635a8641SAndroid Build Coastguard Worker CHECK(library_->is_valid())
99*635a8641SAndroid Build Coastguard Worker << "Unable to load the mojo_core library. Make sure the library is "
100*635a8641SAndroid Build Coastguard Worker << "in the working directory or is correctly pointed to by the "
101*635a8641SAndroid Build Coastguard Worker << "MOJO_CORE_LIBRARY_PATH environment variable.";
102*635a8641SAndroid Build Coastguard Worker } else {
103*635a8641SAndroid Build Coastguard Worker CHECK(library_->is_valid())
104*635a8641SAndroid Build Coastguard Worker << "Unable to locate mojo_core library. This application expects to "
105*635a8641SAndroid Build Coastguard Worker << "find it at " << library_path->value();
106*635a8641SAndroid Build Coastguard Worker }
107*635a8641SAndroid Build Coastguard Worker
108*635a8641SAndroid Build Coastguard Worker const char kGetThunksFunctionName[] = "MojoGetSystemThunks";
109*635a8641SAndroid Build Coastguard Worker {
110*635a8641SAndroid Build Coastguard Worker auto writer = base::AutoWritableMemory::Create(g_get_thunks);
111*635a8641SAndroid Build Coastguard Worker *g_get_thunks = reinterpret_cast<MojoGetSystemThunksFunction>(
112*635a8641SAndroid Build Coastguard Worker library_->GetFunctionPointer(kGetThunksFunctionName));
113*635a8641SAndroid Build Coastguard Worker }
114*635a8641SAndroid Build Coastguard Worker CHECK(*g_get_thunks) << "Invalid mojo_core library: "
115*635a8641SAndroid Build Coastguard Worker << library_path->value();
116*635a8641SAndroid Build Coastguard Worker
117*635a8641SAndroid Build Coastguard Worker DCHECK_EQ(g_thunks->size, 0u);
118*635a8641SAndroid Build Coastguard Worker {
119*635a8641SAndroid Build Coastguard Worker auto writer = base::AutoWritableMemory::Create(g_thunks);
120*635a8641SAndroid Build Coastguard Worker g_thunks->size = sizeof(*g_thunks);
121*635a8641SAndroid Build Coastguard Worker base::UnsanitizedCfiCall(g_get_thunks)(&*g_thunks);
122*635a8641SAndroid Build Coastguard Worker }
123*635a8641SAndroid Build Coastguard Worker
124*635a8641SAndroid Build Coastguard Worker CHECK_GT(g_thunks->size, 0u)
125*635a8641SAndroid Build Coastguard Worker << "Invalid mojo_core library: " << library_path->value();
126*635a8641SAndroid Build Coastguard Worker #else // defined(OS_CHROMEOS) || defined(OS_LINUX)
127*635a8641SAndroid Build Coastguard Worker NOTREACHED()
128*635a8641SAndroid Build Coastguard Worker << "Dynamic mojo_core loading is not supported on this platform.";
129*635a8641SAndroid Build Coastguard Worker #endif // defined(OS_CHROMEOS) || defined(OS_LINUX)
130*635a8641SAndroid Build Coastguard Worker }
131*635a8641SAndroid Build Coastguard Worker
132*635a8641SAndroid Build Coastguard Worker ~CoreLibraryInitializer() = default;
133*635a8641SAndroid Build Coastguard Worker
134*635a8641SAndroid Build Coastguard Worker private:
135*635a8641SAndroid Build Coastguard Worker #if defined(OS_CHROMEOS) || defined(OS_LINUX) || defined(OS_WIN)
136*635a8641SAndroid Build Coastguard Worker base::Optional<base::ScopedNativeLibrary> library_;
137*635a8641SAndroid Build Coastguard Worker #endif
138*635a8641SAndroid Build Coastguard Worker
139*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(CoreLibraryInitializer);
140*635a8641SAndroid Build Coastguard Worker };
141*635a8641SAndroid Build Coastguard Worker
142*635a8641SAndroid Build Coastguard Worker } // namespace mojo
143*635a8641SAndroid Build Coastguard Worker
144*635a8641SAndroid Build Coastguard Worker extern "C" {
145*635a8641SAndroid Build Coastguard Worker
MojoInitialize(const struct MojoInitializeOptions * options)146*635a8641SAndroid Build Coastguard Worker MojoResult MojoInitialize(const struct MojoInitializeOptions* options) {
147*635a8641SAndroid Build Coastguard Worker static base::NoDestructor<mojo::CoreLibraryInitializer> initializer(options);
148*635a8641SAndroid Build Coastguard Worker ALLOW_UNUSED_LOCAL(initializer);
149*635a8641SAndroid Build Coastguard Worker DCHECK(g_thunks->Initialize);
150*635a8641SAndroid Build Coastguard Worker
151*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(Initialize, options);
152*635a8641SAndroid Build Coastguard Worker }
153*635a8641SAndroid Build Coastguard Worker
MojoGetTimeTicksNow()154*635a8641SAndroid Build Coastguard Worker MojoTimeTicks MojoGetTimeTicksNow() {
155*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(GetTimeTicksNow);
156*635a8641SAndroid Build Coastguard Worker }
157*635a8641SAndroid Build Coastguard Worker
MojoClose(MojoHandle handle)158*635a8641SAndroid Build Coastguard Worker MojoResult MojoClose(MojoHandle handle) {
159*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(Close, handle);
160*635a8641SAndroid Build Coastguard Worker }
161*635a8641SAndroid Build Coastguard Worker
MojoQueryHandleSignalsState(MojoHandle handle,struct MojoHandleSignalsState * signals_state)162*635a8641SAndroid Build Coastguard Worker MojoResult MojoQueryHandleSignalsState(
163*635a8641SAndroid Build Coastguard Worker MojoHandle handle,
164*635a8641SAndroid Build Coastguard Worker struct MojoHandleSignalsState* signals_state) {
165*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(QueryHandleSignalsState, handle, signals_state);
166*635a8641SAndroid Build Coastguard Worker }
167*635a8641SAndroid Build Coastguard Worker
MojoCreateMessagePipe(const MojoCreateMessagePipeOptions * options,MojoHandle * message_pipe_handle0,MojoHandle * message_pipe_handle1)168*635a8641SAndroid Build Coastguard Worker MojoResult MojoCreateMessagePipe(const MojoCreateMessagePipeOptions* options,
169*635a8641SAndroid Build Coastguard Worker MojoHandle* message_pipe_handle0,
170*635a8641SAndroid Build Coastguard Worker MojoHandle* message_pipe_handle1) {
171*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(CreateMessagePipe, options, message_pipe_handle0,
172*635a8641SAndroid Build Coastguard Worker message_pipe_handle1);
173*635a8641SAndroid Build Coastguard Worker }
174*635a8641SAndroid Build Coastguard Worker
MojoWriteMessage(MojoHandle message_pipe_handle,MojoMessageHandle message_handle,const MojoWriteMessageOptions * options)175*635a8641SAndroid Build Coastguard Worker MojoResult MojoWriteMessage(MojoHandle message_pipe_handle,
176*635a8641SAndroid Build Coastguard Worker MojoMessageHandle message_handle,
177*635a8641SAndroid Build Coastguard Worker const MojoWriteMessageOptions* options) {
178*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(WriteMessage, message_pipe_handle, message_handle,
179*635a8641SAndroid Build Coastguard Worker options);
180*635a8641SAndroid Build Coastguard Worker }
181*635a8641SAndroid Build Coastguard Worker
MojoReadMessage(MojoHandle message_pipe_handle,const MojoReadMessageOptions * options,MojoMessageHandle * message_handle)182*635a8641SAndroid Build Coastguard Worker MojoResult MojoReadMessage(MojoHandle message_pipe_handle,
183*635a8641SAndroid Build Coastguard Worker const MojoReadMessageOptions* options,
184*635a8641SAndroid Build Coastguard Worker MojoMessageHandle* message_handle) {
185*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(ReadMessage, message_pipe_handle, options,
186*635a8641SAndroid Build Coastguard Worker message_handle);
187*635a8641SAndroid Build Coastguard Worker }
188*635a8641SAndroid Build Coastguard Worker
MojoFuseMessagePipes(MojoHandle handle0,MojoHandle handle1,const MojoFuseMessagePipesOptions * options)189*635a8641SAndroid Build Coastguard Worker MojoResult MojoFuseMessagePipes(MojoHandle handle0,
190*635a8641SAndroid Build Coastguard Worker MojoHandle handle1,
191*635a8641SAndroid Build Coastguard Worker const MojoFuseMessagePipesOptions* options) {
192*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(FuseMessagePipes, handle0, handle1, options);
193*635a8641SAndroid Build Coastguard Worker }
194*635a8641SAndroid Build Coastguard Worker
MojoCreateDataPipe(const MojoCreateDataPipeOptions * options,MojoHandle * data_pipe_producer_handle,MojoHandle * data_pipe_consumer_handle)195*635a8641SAndroid Build Coastguard Worker MojoResult MojoCreateDataPipe(const MojoCreateDataPipeOptions* options,
196*635a8641SAndroid Build Coastguard Worker MojoHandle* data_pipe_producer_handle,
197*635a8641SAndroid Build Coastguard Worker MojoHandle* data_pipe_consumer_handle) {
198*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(CreateDataPipe, options, data_pipe_producer_handle,
199*635a8641SAndroid Build Coastguard Worker data_pipe_consumer_handle);
200*635a8641SAndroid Build Coastguard Worker }
201*635a8641SAndroid Build Coastguard Worker
MojoWriteData(MojoHandle data_pipe_producer_handle,const void * elements,uint32_t * num_elements,const MojoWriteDataOptions * options)202*635a8641SAndroid Build Coastguard Worker MojoResult MojoWriteData(MojoHandle data_pipe_producer_handle,
203*635a8641SAndroid Build Coastguard Worker const void* elements,
204*635a8641SAndroid Build Coastguard Worker uint32_t* num_elements,
205*635a8641SAndroid Build Coastguard Worker const MojoWriteDataOptions* options) {
206*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(WriteData, data_pipe_producer_handle, elements,
207*635a8641SAndroid Build Coastguard Worker num_elements, options);
208*635a8641SAndroid Build Coastguard Worker }
209*635a8641SAndroid Build Coastguard Worker
MojoBeginWriteData(MojoHandle data_pipe_producer_handle,const MojoBeginWriteDataOptions * options,void ** buffer,uint32_t * buffer_num_elements)210*635a8641SAndroid Build Coastguard Worker MojoResult MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
211*635a8641SAndroid Build Coastguard Worker const MojoBeginWriteDataOptions* options,
212*635a8641SAndroid Build Coastguard Worker void** buffer,
213*635a8641SAndroid Build Coastguard Worker uint32_t* buffer_num_elements) {
214*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(BeginWriteData, data_pipe_producer_handle, options,
215*635a8641SAndroid Build Coastguard Worker buffer, buffer_num_elements);
216*635a8641SAndroid Build Coastguard Worker }
217*635a8641SAndroid Build Coastguard Worker
MojoEndWriteData(MojoHandle data_pipe_producer_handle,uint32_t num_elements_written,const MojoEndWriteDataOptions * options)218*635a8641SAndroid Build Coastguard Worker MojoResult MojoEndWriteData(MojoHandle data_pipe_producer_handle,
219*635a8641SAndroid Build Coastguard Worker uint32_t num_elements_written,
220*635a8641SAndroid Build Coastguard Worker const MojoEndWriteDataOptions* options) {
221*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(EndWriteData, data_pipe_producer_handle,
222*635a8641SAndroid Build Coastguard Worker num_elements_written, options);
223*635a8641SAndroid Build Coastguard Worker }
224*635a8641SAndroid Build Coastguard Worker
MojoReadData(MojoHandle data_pipe_consumer_handle,const MojoReadDataOptions * options,void * elements,uint32_t * num_elements)225*635a8641SAndroid Build Coastguard Worker MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
226*635a8641SAndroid Build Coastguard Worker const MojoReadDataOptions* options,
227*635a8641SAndroid Build Coastguard Worker void* elements,
228*635a8641SAndroid Build Coastguard Worker uint32_t* num_elements) {
229*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(ReadData, data_pipe_consumer_handle, options, elements,
230*635a8641SAndroid Build Coastguard Worker num_elements);
231*635a8641SAndroid Build Coastguard Worker }
232*635a8641SAndroid Build Coastguard Worker
MojoBeginReadData(MojoHandle data_pipe_consumer_handle,const MojoBeginReadDataOptions * options,const void ** buffer,uint32_t * buffer_num_elements)233*635a8641SAndroid Build Coastguard Worker MojoResult MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
234*635a8641SAndroid Build Coastguard Worker const MojoBeginReadDataOptions* options,
235*635a8641SAndroid Build Coastguard Worker const void** buffer,
236*635a8641SAndroid Build Coastguard Worker uint32_t* buffer_num_elements) {
237*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(BeginReadData, data_pipe_consumer_handle, options, buffer,
238*635a8641SAndroid Build Coastguard Worker buffer_num_elements);
239*635a8641SAndroid Build Coastguard Worker }
240*635a8641SAndroid Build Coastguard Worker
MojoEndReadData(MojoHandle data_pipe_consumer_handle,uint32_t num_elements_read,const MojoEndReadDataOptions * options)241*635a8641SAndroid Build Coastguard Worker MojoResult MojoEndReadData(MojoHandle data_pipe_consumer_handle,
242*635a8641SAndroid Build Coastguard Worker uint32_t num_elements_read,
243*635a8641SAndroid Build Coastguard Worker const MojoEndReadDataOptions* options) {
244*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(EndReadData, data_pipe_consumer_handle, num_elements_read,
245*635a8641SAndroid Build Coastguard Worker options);
246*635a8641SAndroid Build Coastguard Worker }
247*635a8641SAndroid Build Coastguard Worker
MojoCreateSharedBuffer(uint64_t num_bytes,const MojoCreateSharedBufferOptions * options,MojoHandle * shared_buffer_handle)248*635a8641SAndroid Build Coastguard Worker MojoResult MojoCreateSharedBuffer(uint64_t num_bytes,
249*635a8641SAndroid Build Coastguard Worker const MojoCreateSharedBufferOptions* options,
250*635a8641SAndroid Build Coastguard Worker MojoHandle* shared_buffer_handle) {
251*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(CreateSharedBuffer, num_bytes, options,
252*635a8641SAndroid Build Coastguard Worker shared_buffer_handle);
253*635a8641SAndroid Build Coastguard Worker }
254*635a8641SAndroid Build Coastguard Worker
MojoDuplicateBufferHandle(MojoHandle buffer_handle,const MojoDuplicateBufferHandleOptions * options,MojoHandle * new_buffer_handle)255*635a8641SAndroid Build Coastguard Worker MojoResult MojoDuplicateBufferHandle(
256*635a8641SAndroid Build Coastguard Worker MojoHandle buffer_handle,
257*635a8641SAndroid Build Coastguard Worker const MojoDuplicateBufferHandleOptions* options,
258*635a8641SAndroid Build Coastguard Worker MojoHandle* new_buffer_handle) {
259*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(DuplicateBufferHandle, buffer_handle, options,
260*635a8641SAndroid Build Coastguard Worker new_buffer_handle);
261*635a8641SAndroid Build Coastguard Worker }
262*635a8641SAndroid Build Coastguard Worker
MojoMapBuffer(MojoHandle buffer_handle,uint64_t offset,uint64_t num_bytes,const MojoMapBufferOptions * options,void ** buffer)263*635a8641SAndroid Build Coastguard Worker MojoResult MojoMapBuffer(MojoHandle buffer_handle,
264*635a8641SAndroid Build Coastguard Worker uint64_t offset,
265*635a8641SAndroid Build Coastguard Worker uint64_t num_bytes,
266*635a8641SAndroid Build Coastguard Worker const MojoMapBufferOptions* options,
267*635a8641SAndroid Build Coastguard Worker void** buffer) {
268*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(MapBuffer, buffer_handle, offset, num_bytes, options,
269*635a8641SAndroid Build Coastguard Worker buffer);
270*635a8641SAndroid Build Coastguard Worker }
271*635a8641SAndroid Build Coastguard Worker
MojoUnmapBuffer(void * buffer)272*635a8641SAndroid Build Coastguard Worker MojoResult MojoUnmapBuffer(void* buffer) {
273*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(UnmapBuffer, buffer);
274*635a8641SAndroid Build Coastguard Worker }
275*635a8641SAndroid Build Coastguard Worker
MojoGetBufferInfo(MojoHandle buffer_handle,const MojoGetBufferInfoOptions * options,MojoSharedBufferInfo * info)276*635a8641SAndroid Build Coastguard Worker MojoResult MojoGetBufferInfo(MojoHandle buffer_handle,
277*635a8641SAndroid Build Coastguard Worker const MojoGetBufferInfoOptions* options,
278*635a8641SAndroid Build Coastguard Worker MojoSharedBufferInfo* info) {
279*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(GetBufferInfo, buffer_handle, options, info);
280*635a8641SAndroid Build Coastguard Worker }
281*635a8641SAndroid Build Coastguard Worker
MojoCreateTrap(MojoTrapEventHandler handler,const MojoCreateTrapOptions * options,MojoHandle * trap_handle)282*635a8641SAndroid Build Coastguard Worker MojoResult MojoCreateTrap(MojoTrapEventHandler handler,
283*635a8641SAndroid Build Coastguard Worker const MojoCreateTrapOptions* options,
284*635a8641SAndroid Build Coastguard Worker MojoHandle* trap_handle) {
285*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(CreateTrap, handler, options, trap_handle);
286*635a8641SAndroid Build Coastguard Worker }
287*635a8641SAndroid Build Coastguard Worker
MojoAddTrigger(MojoHandle trap_handle,MojoHandle handle,MojoHandleSignals signals,MojoTriggerCondition condition,uintptr_t context,const MojoAddTriggerOptions * options)288*635a8641SAndroid Build Coastguard Worker MojoResult MojoAddTrigger(MojoHandle trap_handle,
289*635a8641SAndroid Build Coastguard Worker MojoHandle handle,
290*635a8641SAndroid Build Coastguard Worker MojoHandleSignals signals,
291*635a8641SAndroid Build Coastguard Worker MojoTriggerCondition condition,
292*635a8641SAndroid Build Coastguard Worker uintptr_t context,
293*635a8641SAndroid Build Coastguard Worker const MojoAddTriggerOptions* options) {
294*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(AddTrigger, trap_handle, handle, signals, condition,
295*635a8641SAndroid Build Coastguard Worker context, options);
296*635a8641SAndroid Build Coastguard Worker }
297*635a8641SAndroid Build Coastguard Worker
MojoRemoveTrigger(MojoHandle trap_handle,uintptr_t context,const MojoRemoveTriggerOptions * options)298*635a8641SAndroid Build Coastguard Worker MojoResult MojoRemoveTrigger(MojoHandle trap_handle,
299*635a8641SAndroid Build Coastguard Worker uintptr_t context,
300*635a8641SAndroid Build Coastguard Worker const MojoRemoveTriggerOptions* options) {
301*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(RemoveTrigger, trap_handle, context, options);
302*635a8641SAndroid Build Coastguard Worker }
303*635a8641SAndroid Build Coastguard Worker
MojoArmTrap(MojoHandle trap_handle,const MojoArmTrapOptions * options,uint32_t * num_blocking_events,MojoTrapEvent * blocking_events)304*635a8641SAndroid Build Coastguard Worker MojoResult MojoArmTrap(MojoHandle trap_handle,
305*635a8641SAndroid Build Coastguard Worker const MojoArmTrapOptions* options,
306*635a8641SAndroid Build Coastguard Worker uint32_t* num_blocking_events,
307*635a8641SAndroid Build Coastguard Worker MojoTrapEvent* blocking_events) {
308*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(ArmTrap, trap_handle, options, num_blocking_events,
309*635a8641SAndroid Build Coastguard Worker blocking_events);
310*635a8641SAndroid Build Coastguard Worker }
311*635a8641SAndroid Build Coastguard Worker
MojoCreateMessage(const MojoCreateMessageOptions * options,MojoMessageHandle * message)312*635a8641SAndroid Build Coastguard Worker MojoResult MojoCreateMessage(const MojoCreateMessageOptions* options,
313*635a8641SAndroid Build Coastguard Worker MojoMessageHandle* message) {
314*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(CreateMessage, options, message);
315*635a8641SAndroid Build Coastguard Worker }
316*635a8641SAndroid Build Coastguard Worker
MojoDestroyMessage(MojoMessageHandle message)317*635a8641SAndroid Build Coastguard Worker MojoResult MojoDestroyMessage(MojoMessageHandle message) {
318*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(DestroyMessage, message);
319*635a8641SAndroid Build Coastguard Worker }
320*635a8641SAndroid Build Coastguard Worker
MojoSerializeMessage(MojoMessageHandle message,const MojoSerializeMessageOptions * options)321*635a8641SAndroid Build Coastguard Worker MojoResult MojoSerializeMessage(MojoMessageHandle message,
322*635a8641SAndroid Build Coastguard Worker const MojoSerializeMessageOptions* options) {
323*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(SerializeMessage, message, options);
324*635a8641SAndroid Build Coastguard Worker }
325*635a8641SAndroid Build Coastguard Worker
MojoAppendMessageData(MojoMessageHandle message,uint32_t payload_size,const MojoHandle * handles,uint32_t num_handles,const MojoAppendMessageDataOptions * options,void ** buffer,uint32_t * buffer_size)326*635a8641SAndroid Build Coastguard Worker MojoResult MojoAppendMessageData(MojoMessageHandle message,
327*635a8641SAndroid Build Coastguard Worker uint32_t payload_size,
328*635a8641SAndroid Build Coastguard Worker const MojoHandle* handles,
329*635a8641SAndroid Build Coastguard Worker uint32_t num_handles,
330*635a8641SAndroid Build Coastguard Worker const MojoAppendMessageDataOptions* options,
331*635a8641SAndroid Build Coastguard Worker void** buffer,
332*635a8641SAndroid Build Coastguard Worker uint32_t* buffer_size) {
333*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(AppendMessageData, message, payload_size, handles,
334*635a8641SAndroid Build Coastguard Worker num_handles, options, buffer, buffer_size);
335*635a8641SAndroid Build Coastguard Worker }
336*635a8641SAndroid Build Coastguard Worker
MojoGetMessageData(MojoMessageHandle message,const MojoGetMessageDataOptions * options,void ** buffer,uint32_t * num_bytes,MojoHandle * handles,uint32_t * num_handles)337*635a8641SAndroid Build Coastguard Worker MojoResult MojoGetMessageData(MojoMessageHandle message,
338*635a8641SAndroid Build Coastguard Worker const MojoGetMessageDataOptions* options,
339*635a8641SAndroid Build Coastguard Worker void** buffer,
340*635a8641SAndroid Build Coastguard Worker uint32_t* num_bytes,
341*635a8641SAndroid Build Coastguard Worker MojoHandle* handles,
342*635a8641SAndroid Build Coastguard Worker uint32_t* num_handles) {
343*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(GetMessageData, message, options, buffer, num_bytes,
344*635a8641SAndroid Build Coastguard Worker handles, num_handles);
345*635a8641SAndroid Build Coastguard Worker }
346*635a8641SAndroid Build Coastguard Worker
MojoSetMessageContext(MojoMessageHandle message,uintptr_t context,MojoMessageContextSerializer serializer,MojoMessageContextDestructor destructor,const MojoSetMessageContextOptions * options)347*635a8641SAndroid Build Coastguard Worker MojoResult MojoSetMessageContext(MojoMessageHandle message,
348*635a8641SAndroid Build Coastguard Worker uintptr_t context,
349*635a8641SAndroid Build Coastguard Worker MojoMessageContextSerializer serializer,
350*635a8641SAndroid Build Coastguard Worker MojoMessageContextDestructor destructor,
351*635a8641SAndroid Build Coastguard Worker const MojoSetMessageContextOptions* options) {
352*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(SetMessageContext, message, context, serializer,
353*635a8641SAndroid Build Coastguard Worker destructor, options);
354*635a8641SAndroid Build Coastguard Worker }
355*635a8641SAndroid Build Coastguard Worker
MojoGetMessageContext(MojoMessageHandle message,const MojoGetMessageContextOptions * options,uintptr_t * context)356*635a8641SAndroid Build Coastguard Worker MojoResult MojoGetMessageContext(MojoMessageHandle message,
357*635a8641SAndroid Build Coastguard Worker const MojoGetMessageContextOptions* options,
358*635a8641SAndroid Build Coastguard Worker uintptr_t* context) {
359*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(GetMessageContext, message, options, context);
360*635a8641SAndroid Build Coastguard Worker }
361*635a8641SAndroid Build Coastguard Worker
MojoNotifyBadMessage(MojoMessageHandle message,const char * error,uint32_t error_num_bytes,const MojoNotifyBadMessageOptions * options)362*635a8641SAndroid Build Coastguard Worker MojoResult MojoNotifyBadMessage(MojoMessageHandle message,
363*635a8641SAndroid Build Coastguard Worker const char* error,
364*635a8641SAndroid Build Coastguard Worker uint32_t error_num_bytes,
365*635a8641SAndroid Build Coastguard Worker const MojoNotifyBadMessageOptions* options) {
366*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(NotifyBadMessage, message, error, error_num_bytes,
367*635a8641SAndroid Build Coastguard Worker options);
368*635a8641SAndroid Build Coastguard Worker }
369*635a8641SAndroid Build Coastguard Worker
MojoWrapPlatformHandle(const MojoPlatformHandle * platform_handle,const MojoWrapPlatformHandleOptions * options,MojoHandle * mojo_handle)370*635a8641SAndroid Build Coastguard Worker MojoResult MojoWrapPlatformHandle(const MojoPlatformHandle* platform_handle,
371*635a8641SAndroid Build Coastguard Worker const MojoWrapPlatformHandleOptions* options,
372*635a8641SAndroid Build Coastguard Worker MojoHandle* mojo_handle) {
373*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(WrapPlatformHandle, platform_handle, options,
374*635a8641SAndroid Build Coastguard Worker mojo_handle);
375*635a8641SAndroid Build Coastguard Worker }
376*635a8641SAndroid Build Coastguard Worker
MojoUnwrapPlatformHandle(MojoHandle mojo_handle,const MojoUnwrapPlatformHandleOptions * options,MojoPlatformHandle * platform_handle)377*635a8641SAndroid Build Coastguard Worker MojoResult MojoUnwrapPlatformHandle(
378*635a8641SAndroid Build Coastguard Worker MojoHandle mojo_handle,
379*635a8641SAndroid Build Coastguard Worker const MojoUnwrapPlatformHandleOptions* options,
380*635a8641SAndroid Build Coastguard Worker MojoPlatformHandle* platform_handle) {
381*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(UnwrapPlatformHandle, mojo_handle, options,
382*635a8641SAndroid Build Coastguard Worker platform_handle);
383*635a8641SAndroid Build Coastguard Worker }
384*635a8641SAndroid Build Coastguard Worker
MojoWrapPlatformSharedMemoryRegion(const struct MojoPlatformHandle * platform_handles,uint32_t num_platform_handles,uint64_t num_bytes,const MojoSharedBufferGuid * guid,MojoPlatformSharedMemoryRegionAccessMode access_mode,const MojoWrapPlatformSharedMemoryRegionOptions * options,MojoHandle * mojo_handle)385*635a8641SAndroid Build Coastguard Worker MojoResult MojoWrapPlatformSharedMemoryRegion(
386*635a8641SAndroid Build Coastguard Worker const struct MojoPlatformHandle* platform_handles,
387*635a8641SAndroid Build Coastguard Worker uint32_t num_platform_handles,
388*635a8641SAndroid Build Coastguard Worker uint64_t num_bytes,
389*635a8641SAndroid Build Coastguard Worker const MojoSharedBufferGuid* guid,
390*635a8641SAndroid Build Coastguard Worker MojoPlatformSharedMemoryRegionAccessMode access_mode,
391*635a8641SAndroid Build Coastguard Worker const MojoWrapPlatformSharedMemoryRegionOptions* options,
392*635a8641SAndroid Build Coastguard Worker MojoHandle* mojo_handle) {
393*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(WrapPlatformSharedMemoryRegion, platform_handles,
394*635a8641SAndroid Build Coastguard Worker num_platform_handles, num_bytes, guid, access_mode,
395*635a8641SAndroid Build Coastguard Worker options, mojo_handle);
396*635a8641SAndroid Build Coastguard Worker }
397*635a8641SAndroid Build Coastguard Worker
MojoUnwrapPlatformSharedMemoryRegion(MojoHandle mojo_handle,const MojoUnwrapPlatformSharedMemoryRegionOptions * options,struct MojoPlatformHandle * platform_handles,uint32_t * num_platform_handles,uint64_t * num_bytes,struct MojoSharedBufferGuid * guid,MojoPlatformSharedMemoryRegionAccessMode * access_mode)398*635a8641SAndroid Build Coastguard Worker MojoResult MojoUnwrapPlatformSharedMemoryRegion(
399*635a8641SAndroid Build Coastguard Worker MojoHandle mojo_handle,
400*635a8641SAndroid Build Coastguard Worker const MojoUnwrapPlatformSharedMemoryRegionOptions* options,
401*635a8641SAndroid Build Coastguard Worker struct MojoPlatformHandle* platform_handles,
402*635a8641SAndroid Build Coastguard Worker uint32_t* num_platform_handles,
403*635a8641SAndroid Build Coastguard Worker uint64_t* num_bytes,
404*635a8641SAndroid Build Coastguard Worker struct MojoSharedBufferGuid* guid,
405*635a8641SAndroid Build Coastguard Worker MojoPlatformSharedMemoryRegionAccessMode* access_mode) {
406*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(UnwrapPlatformSharedMemoryRegion, mojo_handle, options,
407*635a8641SAndroid Build Coastguard Worker platform_handles, num_platform_handles, num_bytes, guid,
408*635a8641SAndroid Build Coastguard Worker access_mode);
409*635a8641SAndroid Build Coastguard Worker }
410*635a8641SAndroid Build Coastguard Worker
MojoCreateInvitation(const MojoCreateInvitationOptions * options,MojoHandle * invitation_handle)411*635a8641SAndroid Build Coastguard Worker MojoResult MojoCreateInvitation(const MojoCreateInvitationOptions* options,
412*635a8641SAndroid Build Coastguard Worker MojoHandle* invitation_handle) {
413*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(CreateInvitation, options, invitation_handle);
414*635a8641SAndroid Build Coastguard Worker }
415*635a8641SAndroid Build Coastguard Worker
MojoAttachMessagePipeToInvitation(MojoHandle invitation_handle,const void * name,uint32_t name_num_bytes,const MojoAttachMessagePipeToInvitationOptions * options,MojoHandle * message_pipe_handle)416*635a8641SAndroid Build Coastguard Worker MojoResult MojoAttachMessagePipeToInvitation(
417*635a8641SAndroid Build Coastguard Worker MojoHandle invitation_handle,
418*635a8641SAndroid Build Coastguard Worker const void* name,
419*635a8641SAndroid Build Coastguard Worker uint32_t name_num_bytes,
420*635a8641SAndroid Build Coastguard Worker const MojoAttachMessagePipeToInvitationOptions* options,
421*635a8641SAndroid Build Coastguard Worker MojoHandle* message_pipe_handle) {
422*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(AttachMessagePipeToInvitation, invitation_handle, name,
423*635a8641SAndroid Build Coastguard Worker name_num_bytes, options, message_pipe_handle);
424*635a8641SAndroid Build Coastguard Worker }
425*635a8641SAndroid Build Coastguard Worker
MojoExtractMessagePipeFromInvitation(MojoHandle invitation_handle,const void * name,uint32_t name_num_bytes,const MojoExtractMessagePipeFromInvitationOptions * options,MojoHandle * message_pipe_handle)426*635a8641SAndroid Build Coastguard Worker MojoResult MojoExtractMessagePipeFromInvitation(
427*635a8641SAndroid Build Coastguard Worker MojoHandle invitation_handle,
428*635a8641SAndroid Build Coastguard Worker const void* name,
429*635a8641SAndroid Build Coastguard Worker uint32_t name_num_bytes,
430*635a8641SAndroid Build Coastguard Worker const MojoExtractMessagePipeFromInvitationOptions* options,
431*635a8641SAndroid Build Coastguard Worker MojoHandle* message_pipe_handle) {
432*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(ExtractMessagePipeFromInvitation, invitation_handle, name,
433*635a8641SAndroid Build Coastguard Worker name_num_bytes, options, message_pipe_handle);
434*635a8641SAndroid Build Coastguard Worker }
435*635a8641SAndroid Build Coastguard Worker
MojoSendInvitation(MojoHandle invitation_handle,const MojoPlatformProcessHandle * process_handle,const MojoInvitationTransportEndpoint * transport_endpoint,MojoProcessErrorHandler error_handler,uintptr_t error_handler_context,const MojoSendInvitationOptions * options)436*635a8641SAndroid Build Coastguard Worker MojoResult MojoSendInvitation(
437*635a8641SAndroid Build Coastguard Worker MojoHandle invitation_handle,
438*635a8641SAndroid Build Coastguard Worker const MojoPlatformProcessHandle* process_handle,
439*635a8641SAndroid Build Coastguard Worker const MojoInvitationTransportEndpoint* transport_endpoint,
440*635a8641SAndroid Build Coastguard Worker MojoProcessErrorHandler error_handler,
441*635a8641SAndroid Build Coastguard Worker uintptr_t error_handler_context,
442*635a8641SAndroid Build Coastguard Worker const MojoSendInvitationOptions* options) {
443*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(SendInvitation, invitation_handle, process_handle,
444*635a8641SAndroid Build Coastguard Worker transport_endpoint, error_handler, error_handler_context,
445*635a8641SAndroid Build Coastguard Worker options);
446*635a8641SAndroid Build Coastguard Worker }
447*635a8641SAndroid Build Coastguard Worker
MojoAcceptInvitation(const MojoInvitationTransportEndpoint * transport_endpoint,const MojoAcceptInvitationOptions * options,MojoHandle * invitation_handle)448*635a8641SAndroid Build Coastguard Worker MojoResult MojoAcceptInvitation(
449*635a8641SAndroid Build Coastguard Worker const MojoInvitationTransportEndpoint* transport_endpoint,
450*635a8641SAndroid Build Coastguard Worker const MojoAcceptInvitationOptions* options,
451*635a8641SAndroid Build Coastguard Worker MojoHandle* invitation_handle) {
452*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(AcceptInvitation, transport_endpoint, options,
453*635a8641SAndroid Build Coastguard Worker invitation_handle);
454*635a8641SAndroid Build Coastguard Worker }
455*635a8641SAndroid Build Coastguard Worker
MojoSetQuota(MojoHandle handle,MojoQuotaType type,uint64_t limit,const MojoSetQuotaOptions * options)456*635a8641SAndroid Build Coastguard Worker MojoResult MojoSetQuota(MojoHandle handle,
457*635a8641SAndroid Build Coastguard Worker MojoQuotaType type,
458*635a8641SAndroid Build Coastguard Worker uint64_t limit,
459*635a8641SAndroid Build Coastguard Worker const MojoSetQuotaOptions* options) {
460*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(SetQuota, handle, type, limit, options);
461*635a8641SAndroid Build Coastguard Worker }
462*635a8641SAndroid Build Coastguard Worker
MojoQueryQuota(MojoHandle handle,MojoQuotaType type,const MojoQueryQuotaOptions * options,uint64_t * limit,uint64_t * usage)463*635a8641SAndroid Build Coastguard Worker MojoResult MojoQueryQuota(MojoHandle handle,
464*635a8641SAndroid Build Coastguard Worker MojoQuotaType type,
465*635a8641SAndroid Build Coastguard Worker const MojoQueryQuotaOptions* options,
466*635a8641SAndroid Build Coastguard Worker uint64_t* limit,
467*635a8641SAndroid Build Coastguard Worker uint64_t* usage) {
468*635a8641SAndroid Build Coastguard Worker return INVOKE_THUNK(QueryQuota, handle, type, options, limit, usage);
469*635a8641SAndroid Build Coastguard Worker }
470*635a8641SAndroid Build Coastguard Worker
471*635a8641SAndroid Build Coastguard Worker } // extern "C"
472*635a8641SAndroid Build Coastguard Worker
MojoEmbedderSetSystemThunks(const MojoSystemThunks * thunks)473*635a8641SAndroid Build Coastguard Worker void MojoEmbedderSetSystemThunks(const MojoSystemThunks* thunks) {
474*635a8641SAndroid Build Coastguard Worker // Assume embedders will always use matching versions of the Mojo Core and
475*635a8641SAndroid Build Coastguard Worker // public APIs.
476*635a8641SAndroid Build Coastguard Worker DCHECK_EQ(thunks->size, sizeof(*g_thunks));
477*635a8641SAndroid Build Coastguard Worker
478*635a8641SAndroid Build Coastguard Worker // This should only have to check that the |g_thunks->size| is zero, but we
479*635a8641SAndroid Build Coastguard Worker // have multiple Mojo Core initializations in some test suites still. For now
480*635a8641SAndroid Build Coastguard Worker // we allow double calls as long as they're the same thunks as before.
481*635a8641SAndroid Build Coastguard Worker DCHECK(g_thunks->size == 0 || !memcmp(&*g_thunks, thunks, sizeof(*g_thunks)))
482*635a8641SAndroid Build Coastguard Worker << "Cannot set embedder thunks after Mojo API calls have been made.";
483*635a8641SAndroid Build Coastguard Worker
484*635a8641SAndroid Build Coastguard Worker auto writer = base::AutoWritableMemory::Create(g_thunks);
485*635a8641SAndroid Build Coastguard Worker *g_thunks = *thunks;
486*635a8641SAndroid Build Coastguard Worker }
487