xref: /aosp_15_r20/external/libchrome/mojo/public/c/system/thunks.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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