1a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// found in the LICENSE file.
4a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Note: This header should be compilable as C.
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#ifndef MOJO_PUBLIC_PLATFORM_NATIVE_SYSTEM_THUNKS_H_
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#define MOJO_PUBLIC_PLATFORM_NATIVE_SYSTEM_THUNKS_H_
9a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include <stddef.h>
11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
12a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "mojo/public/c/system/core.h"
13a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The embedder needs to bind the basic Mojo Core functions of a DSO to those of
15a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// the embedder when loading a DSO that is dependent on mojo_system.
16a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The typical usage would look like:
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// base::ScopedNativeLibrary app_library(
18a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//     base::LoadNativeLibrary(app_path_, &error));
19a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// typedef MojoResult (*MojoSetSystemThunksFn)(MojoSystemThunks*);
20a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// MojoSetSystemThunksFn mojo_set_system_thunks_fn =
21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//     reinterpret_cast<MojoSetSystemThunksFn>(app_library.GetFunctionPointer(
22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//         "MojoSetSystemThunks"));
23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// MojoSystemThunks system_thunks = MojoMakeSystemThunks();
24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// size_t expected_size = mojo_set_system_thunks_fn(&system_thunks);
25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// if (expected_size > sizeof(MojoSystemThunks)) {
26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//   LOG(ERROR)
27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//       << "Invalid DSO. Expected MojoSystemThunks size: "
28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//       << expected_size;
29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//   break;
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// }
31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Structure used to bind the basic Mojo Core functions of a DSO to those of
33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// the embedder.
34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// This is the ABI between the embedder and the DSO. It can only have new
35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// functions added to the end. No other changes are supported.
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#pragma pack(push, 8)
37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochstruct MojoSystemThunks {
38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  size_t size;  // Should be set to sizeof(MojoSystemThunks).
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoTimeTicks (*GetTimeTicksNow)();
40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*Close)(MojoHandle handle);
41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*Wait)(MojoHandle handle,
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     MojoHandleSignals signals,
43a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                     MojoDeadline deadline);
44a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*WaitMany)(const MojoHandle* handles,
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                         const MojoHandleSignals* signals,
46a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         uint32_t num_handles,
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         MojoDeadline deadline);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MojoResult (*CreateMessagePipe)(
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const struct MojoCreateMessagePipeOptions* options,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MojoHandle* message_pipe_handle0,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MojoHandle* message_pipe_handle1);
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*WriteMessage)(MojoHandle message_pipe_handle,
53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             const void* bytes,
54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             uint32_t num_bytes,
55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             const MojoHandle* handles,
56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             uint32_t num_handles,
57a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             MojoWriteMessageFlags flags);
58a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*ReadMessage)(MojoHandle message_pipe_handle,
59a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            void* bytes,
60a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            uint32_t* num_bytes,
61a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            MojoHandle* handles,
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            uint32_t* num_handles,
63a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            MojoReadMessageFlags flags);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MojoResult (*CreateDataPipe)(const struct MojoCreateDataPipeOptions* options,
65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               MojoHandle* data_pipe_producer_handle,
66a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               MojoHandle* data_pipe_consumer_handle);
67a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*WriteData)(MojoHandle data_pipe_producer_handle,
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          const void* elements,
69a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          uint32_t* num_elements,
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          MojoWriteDataFlags flags);
71a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*BeginWriteData)(MojoHandle data_pipe_producer_handle,
72a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               void** buffer,
73a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               uint32_t* buffer_num_elements,
74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                               MojoWriteDataFlags flags);
75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*EndWriteData)(MojoHandle data_pipe_producer_handle,
76a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                             uint32_t num_elements_written);
77a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*ReadData)(MojoHandle data_pipe_consumer_handle,
78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         void* elements,
79a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         uint32_t* num_elements,
80a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         MojoReadDataFlags flags);
81a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*BeginReadData)(MojoHandle data_pipe_consumer_handle,
82a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                              const void** buffer,
83a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                              uint32_t* buffer_num_elements,
84a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                              MojoReadDataFlags flags);
85a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*EndReadData)(MojoHandle data_pipe_consumer_handle,
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            uint32_t num_elements_read);
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*CreateSharedBuffer)(
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const struct MojoCreateSharedBufferOptions* options,
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      uint64_t num_bytes,
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      MojoHandle* shared_buffer_handle);
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*DuplicateBufferHandle)(
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      MojoHandle buffer_handle,
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      const struct MojoDuplicateBufferHandleOptions* options,
94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      MojoHandle* new_buffer_handle);
95a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*MapBuffer)(MojoHandle buffer_handle,
96a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          uint64_t offset,
97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          uint64_t num_bytes,
98a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          void** buffer,
99a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                          MojoMapBufferFlags flags);
100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoResult (*UnmapBuffer)(void* buffer);
101a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#pragma pack(pop)
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifdef __cplusplus
106a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Intended to be called from the embedder. Returns a |MojoCore| initialized
107a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// to contain pointers to each of the embedder's MojoCore functions.
108a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochinline MojoSystemThunks MojoMakeSystemThunks() {
109a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MojoSystemThunks system_thunks = {
110a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    sizeof(MojoSystemThunks),
111a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoGetTimeTicksNow,
112a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoClose,
113a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoWait,
114a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoWaitMany,
115a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoCreateMessagePipe,
116a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoWriteMessage,
117a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoReadMessage,
118a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoCreateDataPipe,
119a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoWriteData,
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoBeginWriteData,
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoEndWriteData,
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoReadData,
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoBeginReadData,
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoEndReadData,
125a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoCreateSharedBuffer,
126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoDuplicateBufferHandle,
127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoMapBuffer,
128a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MojoUnmapBuffer
129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  };
130a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return system_thunks;
131a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
134a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
135a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// Use this type for the function found by dynamically discovering it in
136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// a DSO linked with mojo_system. For example:
137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// MojoSetSystemThunksFn mojo_set_system_thunks_fn =
138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//     reinterpret_cast<MojoSetSystemThunksFn>(app_library.GetFunctionPointer(
139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch//         "MojoSetSystemThunks"));
140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The expected size of |system_thunks} is returned.
141a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// The contents of |system_thunks| are copied.
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef size_t (*MojoSetSystemThunksFn)(
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const struct MojoSystemThunks* system_thunks);
144a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
145a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif  // MOJO_PUBLIC_PLATFORM_NATIVE_SYSTEM_THUNKS_H_
146