entrypoints.cc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "mojo/core/entrypoints.h"
  5. #include <stdint.h>
  6. #include "base/no_destructor.h"
  7. #include "mojo/core/core.h"
  8. #include "mojo/public/c/system/buffer.h"
  9. #include "mojo/public/c/system/data_pipe.h"
  10. #include "mojo/public/c/system/functions.h"
  11. #include "mojo/public/c/system/message_pipe.h"
  12. #include "mojo/public/c/system/platform_handle.h"
  13. #include "mojo/public/c/system/quota.h"
  14. namespace {
  15. mojo::core::Core* g_core;
  16. extern "C" {
  17. MojoResult MojoInitializeImpl(const struct MojoInitializeOptions* options) {
  18. NOTREACHED() << "Do not call MojoInitialize() as a Mojo Core embedder!";
  19. return MOJO_RESULT_UNIMPLEMENTED;
  20. }
  21. MojoTimeTicks MojoGetTimeTicksNowImpl() {
  22. return g_core->GetTimeTicksNow();
  23. }
  24. MojoResult MojoCloseImpl(MojoHandle handle) {
  25. return g_core->Close(handle);
  26. }
  27. MojoResult MojoQueryHandleSignalsStateImpl(
  28. MojoHandle handle,
  29. MojoHandleSignalsState* signals_state) {
  30. return g_core->QueryHandleSignalsState(handle, signals_state);
  31. }
  32. MojoResult MojoCreateMessagePipeImpl(
  33. const MojoCreateMessagePipeOptions* options,
  34. MojoHandle* message_pipe_handle0,
  35. MojoHandle* message_pipe_handle1) {
  36. return g_core->CreateMessagePipe(options, message_pipe_handle0,
  37. message_pipe_handle1);
  38. }
  39. MojoResult MojoWriteMessageImpl(MojoHandle message_pipe_handle,
  40. MojoMessageHandle message,
  41. const MojoWriteMessageOptions* options) {
  42. return g_core->WriteMessage(message_pipe_handle, message, options);
  43. }
  44. MojoResult MojoReadMessageImpl(MojoHandle message_pipe_handle,
  45. const MojoReadMessageOptions* options,
  46. MojoMessageHandle* message) {
  47. return g_core->ReadMessage(message_pipe_handle, options, message);
  48. }
  49. MojoResult MojoFuseMessagePipesImpl(
  50. MojoHandle handle0,
  51. MojoHandle handle1,
  52. const MojoFuseMessagePipesOptions* options) {
  53. return g_core->FuseMessagePipes(handle0, handle1, options);
  54. }
  55. MojoResult MojoCreateMessageImpl(const MojoCreateMessageOptions* options,
  56. MojoMessageHandle* message) {
  57. return g_core->CreateMessage(options, message);
  58. }
  59. MojoResult MojoDestroyMessageImpl(MojoMessageHandle message) {
  60. return g_core->DestroyMessage(message);
  61. }
  62. MojoResult MojoSerializeMessageImpl(
  63. MojoMessageHandle message,
  64. const MojoSerializeMessageOptions* options) {
  65. return g_core->SerializeMessage(message, options);
  66. }
  67. MojoResult MojoAppendMessageDataImpl(
  68. MojoMessageHandle message,
  69. uint32_t additional_payload_size,
  70. const MojoHandle* handles,
  71. uint32_t num_handles,
  72. const MojoAppendMessageDataOptions* options,
  73. void** buffer,
  74. uint32_t* buffer_size) {
  75. return g_core->AppendMessageData(message, additional_payload_size, handles,
  76. num_handles, options, buffer, buffer_size);
  77. }
  78. MojoResult MojoGetMessageDataImpl(MojoMessageHandle message,
  79. const MojoGetMessageDataOptions* options,
  80. void** buffer,
  81. uint32_t* num_bytes,
  82. MojoHandle* handles,
  83. uint32_t* num_handles) {
  84. return g_core->GetMessageData(message, options, buffer, num_bytes, handles,
  85. num_handles);
  86. }
  87. MojoResult MojoSetMessageContextImpl(
  88. MojoMessageHandle message,
  89. uintptr_t context,
  90. MojoMessageContextSerializer serializer,
  91. MojoMessageContextDestructor destructor,
  92. const MojoSetMessageContextOptions* options) {
  93. return g_core->SetMessageContext(message, context, serializer, destructor,
  94. options);
  95. }
  96. MojoResult MojoGetMessageContextImpl(
  97. MojoMessageHandle message,
  98. const MojoGetMessageContextOptions* options,
  99. uintptr_t* context) {
  100. return g_core->GetMessageContext(message, options, context);
  101. }
  102. MojoResult MojoNotifyBadMessageImpl(
  103. MojoMessageHandle message,
  104. const char* error,
  105. uint32_t error_num_bytes,
  106. const MojoNotifyBadMessageOptions* options) {
  107. return g_core->NotifyBadMessage(message, error, error_num_bytes, options);
  108. }
  109. MojoResult MojoCreateDataPipeImpl(const MojoCreateDataPipeOptions* options,
  110. MojoHandle* data_pipe_producer_handle,
  111. MojoHandle* data_pipe_consumer_handle) {
  112. return g_core->CreateDataPipe(options, data_pipe_producer_handle,
  113. data_pipe_consumer_handle);
  114. }
  115. MojoResult MojoWriteDataImpl(MojoHandle data_pipe_producer_handle,
  116. const void* elements,
  117. uint32_t* num_elements,
  118. const MojoWriteDataOptions* options) {
  119. return g_core->WriteData(data_pipe_producer_handle, elements, num_elements,
  120. options);
  121. }
  122. MojoResult MojoBeginWriteDataImpl(MojoHandle data_pipe_producer_handle,
  123. const MojoBeginWriteDataOptions* options,
  124. void** buffer,
  125. uint32_t* buffer_num_elements) {
  126. return g_core->BeginWriteData(data_pipe_producer_handle, options, buffer,
  127. buffer_num_elements);
  128. }
  129. MojoResult MojoEndWriteDataImpl(MojoHandle data_pipe_producer_handle,
  130. uint32_t num_elements_written,
  131. const MojoEndWriteDataOptions* options) {
  132. return g_core->EndWriteData(data_pipe_producer_handle, num_elements_written,
  133. options);
  134. }
  135. MojoResult MojoReadDataImpl(MojoHandle data_pipe_consumer_handle,
  136. const MojoReadDataOptions* options,
  137. void* elements,
  138. uint32_t* num_elements) {
  139. return g_core->ReadData(data_pipe_consumer_handle, options, elements,
  140. num_elements);
  141. }
  142. MojoResult MojoBeginReadDataImpl(MojoHandle data_pipe_consumer_handle,
  143. const MojoBeginReadDataOptions* options,
  144. const void** buffer,
  145. uint32_t* buffer_num_elements) {
  146. return g_core->BeginReadData(data_pipe_consumer_handle, options, buffer,
  147. buffer_num_elements);
  148. }
  149. MojoResult MojoEndReadDataImpl(MojoHandle data_pipe_consumer_handle,
  150. uint32_t num_elements_read,
  151. const MojoEndReadDataOptions* options) {
  152. return g_core->EndReadData(data_pipe_consumer_handle, num_elements_read,
  153. options);
  154. }
  155. MojoResult MojoCreateSharedBufferImpl(
  156. uint64_t num_bytes,
  157. const MojoCreateSharedBufferOptions* options,
  158. MojoHandle* shared_buffer_handle) {
  159. return g_core->CreateSharedBuffer(num_bytes, options, shared_buffer_handle);
  160. }
  161. MojoResult MojoDuplicateBufferHandleImpl(
  162. MojoHandle buffer_handle,
  163. const MojoDuplicateBufferHandleOptions* options,
  164. MojoHandle* new_buffer_handle) {
  165. return g_core->DuplicateBufferHandle(buffer_handle, options,
  166. new_buffer_handle);
  167. }
  168. MojoResult MojoMapBufferImpl(MojoHandle buffer_handle,
  169. uint64_t offset,
  170. uint64_t num_bytes,
  171. const MojoMapBufferOptions* options,
  172. void** buffer) {
  173. return g_core->MapBuffer(buffer_handle, offset, num_bytes, options, buffer);
  174. }
  175. MojoResult MojoUnmapBufferImpl(void* buffer) {
  176. return g_core->UnmapBuffer(buffer);
  177. }
  178. MojoResult MojoGetBufferInfoImpl(MojoHandle buffer_handle,
  179. const MojoGetBufferInfoOptions* options,
  180. MojoSharedBufferInfo* info) {
  181. return g_core->GetBufferInfo(buffer_handle, options, info);
  182. }
  183. MojoResult MojoCreateTrapImpl(MojoTrapEventHandler handler,
  184. const MojoCreateTrapOptions* options,
  185. MojoHandle* trap_handle) {
  186. return g_core->CreateTrap(handler, options, trap_handle);
  187. }
  188. MojoResult MojoAddTriggerImpl(MojoHandle trap_handle,
  189. MojoHandle handle,
  190. MojoHandleSignals signals,
  191. MojoTriggerCondition condition,
  192. uintptr_t context,
  193. const MojoAddTriggerOptions* options) {
  194. return g_core->AddTrigger(trap_handle, handle, signals, condition, context,
  195. options);
  196. }
  197. MojoResult MojoRemoveTriggerImpl(MojoHandle trap_handle,
  198. uintptr_t context,
  199. const MojoRemoveTriggerOptions* options) {
  200. return g_core->RemoveTrigger(trap_handle, context, options);
  201. }
  202. MojoResult MojoArmTrapImpl(MojoHandle trap_handle,
  203. const MojoArmTrapOptions* options,
  204. uint32_t* num_blocking_events,
  205. MojoTrapEvent* blocking_events) {
  206. return g_core->ArmTrap(trap_handle, options, num_blocking_events,
  207. blocking_events);
  208. }
  209. MojoResult MojoWrapPlatformHandleImpl(
  210. const MojoPlatformHandle* platform_handle,
  211. const MojoWrapPlatformHandleOptions* options,
  212. MojoHandle* mojo_handle) {
  213. return g_core->WrapPlatformHandle(platform_handle, options, mojo_handle);
  214. }
  215. MojoResult MojoUnwrapPlatformHandleImpl(
  216. MojoHandle mojo_handle,
  217. const MojoUnwrapPlatformHandleOptions* options,
  218. MojoPlatformHandle* platform_handle) {
  219. return g_core->UnwrapPlatformHandle(mojo_handle, options, platform_handle);
  220. }
  221. MojoResult MojoWrapPlatformSharedMemoryRegionImpl(
  222. const MojoPlatformHandle* platform_handles,
  223. uint32_t num_platform_handles,
  224. uint64_t num_bytes,
  225. const MojoSharedBufferGuid* guid,
  226. MojoPlatformSharedMemoryRegionAccessMode access_mode,
  227. const MojoWrapPlatformSharedMemoryRegionOptions* options,
  228. MojoHandle* mojo_handle) {
  229. return g_core->WrapPlatformSharedMemoryRegion(
  230. platform_handles, num_platform_handles, num_bytes, guid, access_mode,
  231. options, mojo_handle);
  232. }
  233. MojoResult MojoUnwrapPlatformSharedMemoryRegionImpl(
  234. MojoHandle mojo_handle,
  235. const MojoUnwrapPlatformSharedMemoryRegionOptions* options,
  236. MojoPlatformHandle* platform_handles,
  237. uint32_t* num_platform_handles,
  238. uint64_t* num_bytes,
  239. MojoSharedBufferGuid* guid,
  240. MojoPlatformSharedMemoryRegionAccessMode* access_mode) {
  241. return g_core->UnwrapPlatformSharedMemoryRegion(
  242. mojo_handle, options, platform_handles, num_platform_handles, num_bytes,
  243. guid, access_mode);
  244. }
  245. MojoResult MojoCreateInvitationImpl(const MojoCreateInvitationOptions* options,
  246. MojoHandle* invitation_handle) {
  247. return g_core->CreateInvitation(options, invitation_handle);
  248. }
  249. MojoResult MojoAttachMessagePipeToInvitationImpl(
  250. MojoHandle invitation_handle,
  251. const void* name,
  252. uint32_t name_num_bytes,
  253. const MojoAttachMessagePipeToInvitationOptions* options,
  254. MojoHandle* message_pipe_handle) {
  255. return g_core->AttachMessagePipeToInvitation(
  256. invitation_handle, name, name_num_bytes, options, message_pipe_handle);
  257. }
  258. MojoResult MojoExtractMessagePipeFromInvitationImpl(
  259. MojoHandle invitation_handle,
  260. const void* name,
  261. uint32_t name_num_bytes,
  262. const MojoExtractMessagePipeFromInvitationOptions* options,
  263. MojoHandle* message_pipe_handle) {
  264. return g_core->ExtractMessagePipeFromInvitation(
  265. invitation_handle, name, name_num_bytes, options, message_pipe_handle);
  266. }
  267. MojoResult MojoSendInvitationImpl(
  268. MojoHandle invitation_handle,
  269. const MojoPlatformProcessHandle* process_handle,
  270. const MojoInvitationTransportEndpoint* transport_endpoint,
  271. MojoProcessErrorHandler error_handler,
  272. uintptr_t error_handler_context,
  273. const MojoSendInvitationOptions* options) {
  274. return g_core->SendInvitation(invitation_handle, process_handle,
  275. transport_endpoint, error_handler,
  276. error_handler_context, options);
  277. }
  278. MojoResult MojoAcceptInvitationImpl(
  279. const MojoInvitationTransportEndpoint* transport_endpoint,
  280. const MojoAcceptInvitationOptions* options,
  281. MojoHandle* invitation_handle) {
  282. return g_core->AcceptInvitation(transport_endpoint, options,
  283. invitation_handle);
  284. }
  285. MojoResult MojoSetQuotaImpl(MojoHandle handle,
  286. MojoQuotaType type,
  287. uint64_t limit,
  288. const MojoSetQuotaOptions* options) {
  289. return g_core->SetQuota(handle, type, limit, options);
  290. }
  291. MojoResult MojoQueryQuotaImpl(MojoHandle handle,
  292. MojoQuotaType type,
  293. const MojoQueryQuotaOptions* options,
  294. uint64_t* current_limit,
  295. uint64_t* current_usage) {
  296. return g_core->QueryQuota(handle, type, options, current_limit,
  297. current_usage);
  298. }
  299. MojoResult MojoShutdownImpl(const MojoShutdownOptions* options) {
  300. NOTREACHED() << "Do not call MojoShutdown() as a Mojo Core embedder!";
  301. return MOJO_RESULT_UNIMPLEMENTED;
  302. }
  303. MojoResult MojoSetDefaultProcessErrorHandlerImpl(
  304. MojoDefaultProcessErrorHandler handler,
  305. const MojoSetDefaultProcessErrorHandlerOptions* options) {
  306. return g_core->SetDefaultProcessErrorHandler(handler, options);
  307. }
  308. } // extern "C"
  309. MojoSystemThunks2 g_thunks = {sizeof(g_thunks),
  310. MojoInitializeImpl,
  311. MojoGetTimeTicksNowImpl,
  312. MojoCloseImpl,
  313. MojoQueryHandleSignalsStateImpl,
  314. MojoCreateMessagePipeImpl,
  315. MojoWriteMessageImpl,
  316. MojoReadMessageImpl,
  317. MojoFuseMessagePipesImpl,
  318. MojoCreateMessageImpl,
  319. MojoDestroyMessageImpl,
  320. MojoSerializeMessageImpl,
  321. MojoAppendMessageDataImpl,
  322. MojoGetMessageDataImpl,
  323. MojoSetMessageContextImpl,
  324. MojoGetMessageContextImpl,
  325. MojoNotifyBadMessageImpl,
  326. MojoCreateDataPipeImpl,
  327. MojoWriteDataImpl,
  328. MojoBeginWriteDataImpl,
  329. MojoEndWriteDataImpl,
  330. MojoReadDataImpl,
  331. MojoBeginReadDataImpl,
  332. MojoEndReadDataImpl,
  333. MojoCreateSharedBufferImpl,
  334. MojoDuplicateBufferHandleImpl,
  335. MojoMapBufferImpl,
  336. MojoUnmapBufferImpl,
  337. MojoGetBufferInfoImpl,
  338. MojoCreateTrapImpl,
  339. MojoAddTriggerImpl,
  340. MojoRemoveTriggerImpl,
  341. MojoArmTrapImpl,
  342. MojoWrapPlatformHandleImpl,
  343. MojoUnwrapPlatformHandleImpl,
  344. MojoWrapPlatformSharedMemoryRegionImpl,
  345. MojoUnwrapPlatformSharedMemoryRegionImpl,
  346. MojoCreateInvitationImpl,
  347. MojoAttachMessagePipeToInvitationImpl,
  348. MojoExtractMessagePipeFromInvitationImpl,
  349. MojoSendInvitationImpl,
  350. MojoAcceptInvitationImpl,
  351. MojoSetQuotaImpl,
  352. MojoQueryQuotaImpl,
  353. MojoShutdownImpl,
  354. MojoSetDefaultProcessErrorHandlerImpl};
  355. } // namespace
  356. namespace mojo {
  357. namespace core {
  358. // static
  359. Core* Core::Get() {
  360. return g_core;
  361. }
  362. void InitializeCore() {
  363. static base::NoDestructor<Core> core_instance;
  364. g_core = core_instance.get();
  365. }
  366. const MojoSystemThunks2& GetSystemThunks() {
  367. return g_thunks;
  368. }
  369. } // namespace core
  370. } // namespace mojo