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
5#include "mojo/system/entrypoints.h"
6
7#include "base/logging.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/system/core.h"
13
14static mojo::system::Core* g_core = nullptr;
15
16using mojo::system::MakeUserPointer;
17
18namespace mojo {
19namespace system {
20namespace entrypoints {
21
22void SetCore(Core* core) {
23  g_core = core;
24}
25
26Core* GetCore() {
27  return g_core;
28}
29
30}  // namespace entrypoints
31}  // namepace system
32}  // namespace mojo
33
34// Definitions of the system functions.
35extern "C" {
36MojoTimeTicks MojoGetTimeTicksNow() {
37  return g_core->GetTimeTicksNow();
38}
39
40MojoResult MojoClose(MojoHandle handle) {
41  return g_core->Close(handle);
42}
43
44MojoResult MojoWait(MojoHandle handle,
45                    MojoHandleSignals signals,
46                    MojoDeadline deadline) {
47  return g_core->Wait(
48      handle, signals, deadline, mojo::system::NullUserPointer());
49}
50
51MojoResult MojoWaitMany(const MojoHandle* handles,
52                        const MojoHandleSignals* signals,
53                        uint32_t num_handles,
54                        MojoDeadline deadline) {
55  uint32_t result_index = static_cast<uint32_t>(-1);
56  MojoResult result = g_core->WaitMany(MakeUserPointer(handles),
57                                       MakeUserPointer(signals),
58                                       num_handles,
59                                       deadline,
60                                       MakeUserPointer(&result_index),
61                                       mojo::system::NullUserPointer());
62  return (result == MOJO_RESULT_OK) ? static_cast<MojoResult>(result_index)
63                                    : result;
64}
65
66MojoResult MojoCreateMessagePipe(const MojoCreateMessagePipeOptions* options,
67                                 MojoHandle* message_pipe_handle0,
68                                 MojoHandle* message_pipe_handle1) {
69  return g_core->CreateMessagePipe(MakeUserPointer(options),
70                                   MakeUserPointer(message_pipe_handle0),
71                                   MakeUserPointer(message_pipe_handle1));
72}
73
74MojoResult MojoWriteMessage(MojoHandle message_pipe_handle,
75                            const void* bytes,
76                            uint32_t num_bytes,
77                            const MojoHandle* handles,
78                            uint32_t num_handles,
79                            MojoWriteMessageFlags flags) {
80  return g_core->WriteMessage(message_pipe_handle,
81                              MakeUserPointer(bytes),
82                              num_bytes,
83                              MakeUserPointer(handles),
84                              num_handles,
85                              flags);
86}
87
88MojoResult MojoReadMessage(MojoHandle message_pipe_handle,
89                           void* bytes,
90                           uint32_t* num_bytes,
91                           MojoHandle* handles,
92                           uint32_t* num_handles,
93                           MojoReadMessageFlags flags) {
94  return g_core->ReadMessage(message_pipe_handle,
95                             MakeUserPointer(bytes),
96                             MakeUserPointer(num_bytes),
97                             MakeUserPointer(handles),
98                             MakeUserPointer(num_handles),
99                             flags);
100}
101
102MojoResult MojoCreateDataPipe(const MojoCreateDataPipeOptions* options,
103                              MojoHandle* data_pipe_producer_handle,
104                              MojoHandle* data_pipe_consumer_handle) {
105  return g_core->CreateDataPipe(MakeUserPointer(options),
106                                MakeUserPointer(data_pipe_producer_handle),
107                                MakeUserPointer(data_pipe_consumer_handle));
108}
109
110MojoResult MojoWriteData(MojoHandle data_pipe_producer_handle,
111                         const void* elements,
112                         uint32_t* num_elements,
113                         MojoWriteDataFlags flags) {
114  return g_core->WriteData(data_pipe_producer_handle,
115                           MakeUserPointer(elements),
116                           MakeUserPointer(num_elements),
117                           flags);
118}
119
120MojoResult MojoBeginWriteData(MojoHandle data_pipe_producer_handle,
121                              void** buffer,
122                              uint32_t* buffer_num_elements,
123                              MojoWriteDataFlags flags) {
124  return g_core->BeginWriteData(data_pipe_producer_handle,
125                                MakeUserPointer(buffer),
126                                MakeUserPointer(buffer_num_elements),
127                                flags);
128}
129
130MojoResult MojoEndWriteData(MojoHandle data_pipe_producer_handle,
131                            uint32_t num_elements_written) {
132  return g_core->EndWriteData(data_pipe_producer_handle, num_elements_written);
133}
134
135MojoResult MojoReadData(MojoHandle data_pipe_consumer_handle,
136                        void* elements,
137                        uint32_t* num_elements,
138                        MojoReadDataFlags flags) {
139  return g_core->ReadData(data_pipe_consumer_handle,
140                          MakeUserPointer(elements),
141                          MakeUserPointer(num_elements),
142                          flags);
143}
144
145MojoResult MojoBeginReadData(MojoHandle data_pipe_consumer_handle,
146                             const void** buffer,
147                             uint32_t* buffer_num_elements,
148                             MojoReadDataFlags flags) {
149  return g_core->BeginReadData(data_pipe_consumer_handle,
150                               MakeUserPointer(buffer),
151                               MakeUserPointer(buffer_num_elements),
152                               flags);
153}
154
155MojoResult MojoEndReadData(MojoHandle data_pipe_consumer_handle,
156                           uint32_t num_elements_read) {
157  return g_core->EndReadData(data_pipe_consumer_handle, num_elements_read);
158}
159
160MojoResult MojoCreateSharedBuffer(
161    const struct MojoCreateSharedBufferOptions* options,
162    uint64_t num_bytes,
163    MojoHandle* shared_buffer_handle) {
164  return g_core->CreateSharedBuffer(MakeUserPointer(options),
165                                    num_bytes,
166                                    MakeUserPointer(shared_buffer_handle));
167}
168
169MojoResult MojoDuplicateBufferHandle(
170    MojoHandle buffer_handle,
171    const struct MojoDuplicateBufferHandleOptions* options,
172    MojoHandle* new_buffer_handle) {
173  return g_core->DuplicateBufferHandle(buffer_handle,
174                                       MakeUserPointer(options),
175                                       MakeUserPointer(new_buffer_handle));
176}
177
178MojoResult MojoMapBuffer(MojoHandle buffer_handle,
179                         uint64_t offset,
180                         uint64_t num_bytes,
181                         void** buffer,
182                         MojoMapBufferFlags flags) {
183  return g_core->MapBuffer(
184      buffer_handle, offset, num_bytes, MakeUserPointer(buffer), flags);
185}
186
187MojoResult MojoUnmapBuffer(void* buffer) {
188  return g_core->UnmapBuffer(MakeUserPointer(buffer));
189}
190
191}  // extern "C"
192