Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(641)

Side by Side Diff: mojo/dart/embedder/mojo_natives.cc

Issue 834283003: Update Dart bindings to support updated MojoWait and MojoWaitMany APIs. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Code review revisions Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | mojo/dart/test/core_test.dart » ('j') | mojo/public/dart/src/handle_watcher.dart » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdio.h> 5 #include <stdio.h>
6 #include <string.h> 6 #include <string.h>
7 7
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
11 #include "dart/runtime/include/dart_api.h" 11 #include "dart/runtime/include/dart_api.h"
12 #include "mojo/dart/embedder/builtin.h" 12 #include "mojo/dart/embedder/builtin.h"
13 #include "mojo/public/c/system/core.h" 13 #include "mojo/public/c/system/core.h"
14 #include "mojo/public/cpp/system/core.h"
14 15
15 namespace mojo { 16 namespace mojo {
16 namespace dart { 17 namespace dart {
17 18
18 #define MOJO_NATIVE_LIST(V) \ 19 #define MOJO_NATIVE_LIST(V) \
19 V(MojoSharedBuffer_Create, 2) \ 20 V(MojoSharedBuffer_Create, 2) \
20 V(MojoSharedBuffer_Duplicate, 2) \ 21 V(MojoSharedBuffer_Duplicate, 2) \
21 V(MojoSharedBuffer_Map, 5) \ 22 V(MojoSharedBuffer_Map, 5) \
22 V(MojoSharedBuffer_Unmap, 1) \ 23 V(MojoSharedBuffer_Unmap, 1) \
23 V(MojoDataPipe_Create, 3) \ 24 V(MojoDataPipe_Create, 3) \
24 V(MojoDataPipe_WriteData, 4) \ 25 V(MojoDataPipe_WriteData, 4) \
25 V(MojoDataPipe_BeginWriteData, 3) \ 26 V(MojoDataPipe_BeginWriteData, 3) \
26 V(MojoDataPipe_EndWriteData, 2) \ 27 V(MojoDataPipe_EndWriteData, 2) \
27 V(MojoDataPipe_ReadData, 4) \ 28 V(MojoDataPipe_ReadData, 4) \
28 V(MojoDataPipe_BeginReadData, 3) \ 29 V(MojoDataPipe_BeginReadData, 3) \
29 V(MojoDataPipe_EndReadData, 2) \ 30 V(MojoDataPipe_EndReadData, 2) \
30 V(MojoMessagePipe_Create, 1) \ 31 V(MojoMessagePipe_Create, 1) \
31 V(MojoMessagePipe_Write, 5) \ 32 V(MojoMessagePipe_Write, 5) \
32 V(MojoMessagePipe_Read, 5) \ 33 V(MojoMessagePipe_Read, 5) \
33 V(MojoHandle_Close, 1) \ 34 V(MojoHandle_Close, 1) \
34 V(MojoHandle_Wait, 3) \ 35 V(MojoHandle_Wait, 3) \
35 V(MojoHandle_Register, 1) \ 36 V(MojoHandle_Register, 1) \
36 V(MojoHandle_WaitMany, 4) \ 37 V(MojoHandle_WaitMany, 3) \
37 V(MojoHandleWatcher_SendControlData, 4) \ 38 V(MojoHandleWatcher_SendControlData, 4) \
38 V(MojoHandleWatcher_RecvControlData, 1) \ 39 V(MojoHandleWatcher_RecvControlData, 1) \
39 V(MojoHandleWatcher_SetControlHandle, 1) \ 40 V(MojoHandleWatcher_SetControlHandle, 1) \
40 V(MojoHandleWatcher_GetControlHandle, 0) \ 41 V(MojoHandleWatcher_GetControlHandle, 0)
41 42
42 MOJO_NATIVE_LIST(DECLARE_FUNCTION); 43 MOJO_NATIVE_LIST(DECLARE_FUNCTION);
43 44
44 static struct NativeEntries { 45 static struct NativeEntries {
45 const char* name; 46 const char* name;
46 Dart_NativeFunction function; 47 Dart_NativeFunction function;
47 int argument_count; 48 int argument_count;
48 } MojoEntries[] = {MOJO_NATIVE_LIST(REGISTER_FUNCTION)}; 49 } MojoEntries[] = {MOJO_NATIVE_LIST(REGISTER_FUNCTION)};
49 50
50 Dart_NativeFunction MojoNativeLookup(Dart_Handle name, 51 Dart_NativeFunction MojoNativeLookup(Dart_Handle name,
(...skipping 29 matching lines...) Expand all
80 81
81 static void SetNullReturn(Dart_NativeArguments arguments) { 82 static void SetNullReturn(Dart_NativeArguments arguments) {
82 Dart_SetReturnValue(arguments, Dart_Null()); 83 Dart_SetReturnValue(arguments, Dart_Null());
83 } 84 }
84 85
85 static void SetInvalidArgumentReturn(Dart_NativeArguments arguments) { 86 static void SetInvalidArgumentReturn(Dart_NativeArguments arguments) {
86 Dart_SetIntegerReturnValue( 87 Dart_SetIntegerReturnValue(
87 arguments, static_cast<int64_t>(MOJO_RESULT_INVALID_ARGUMENT)); 88 arguments, static_cast<int64_t>(MOJO_RESULT_INVALID_ARGUMENT));
88 } 89 }
89 90
91 static Dart_Handle MojoLib() {
92 Dart_Handle core_lib_name = Dart_NewStringFromCString("dart:mojo_core");
93 return Dart_LookupLibrary(core_lib_name);
94 }
95
96 static Dart_Handle SignalsStateToDart(Dart_Handle klass,
97 const MojoHandleSignalsState& state) {
98 Dart_Handle arg1 = Dart_NewInteger(state.satisfied_signals);
99 Dart_Handle arg2 = Dart_NewInteger(state.satisfiable_signals);
100 Dart_Handle args[] = {arg1, arg2};
101 return Dart_New(klass, Dart_Null(), 2, args);
102 }
103
90 #define CHECK_INTEGER_ARGUMENT(args, num, result, failure) \ 104 #define CHECK_INTEGER_ARGUMENT(args, num, result, failure) \
91 { \ 105 { \
92 Dart_Handle __status; \ 106 Dart_Handle __status; \
93 __status = Dart_GetNativeIntegerArgument(args, num, result); \ 107 __status = Dart_GetNativeIntegerArgument(args, num, result); \
94 if (Dart_IsError(__status)) { \ 108 if (Dart_IsError(__status)) { \
95 Set##failure##Return(arguments); \ 109 Set##failure##Return(arguments); \
96 return; \ 110 return; \
97 } \ 111 } \
98 } \ 112 } \
99 113
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 } 185 }
172 186
173 void MojoHandle_Wait(Dart_NativeArguments arguments) { 187 void MojoHandle_Wait(Dart_NativeArguments arguments) {
174 int64_t handle = 0; 188 int64_t handle = 0;
175 int64_t signals = 0; 189 int64_t signals = 0;
176 int64_t deadline = 0; 190 int64_t deadline = 0;
177 CHECK_INTEGER_ARGUMENT(arguments, 0, &handle, InvalidArgument); 191 CHECK_INTEGER_ARGUMENT(arguments, 0, &handle, InvalidArgument);
178 CHECK_INTEGER_ARGUMENT(arguments, 1, &signals, InvalidArgument); 192 CHECK_INTEGER_ARGUMENT(arguments, 1, &signals, InvalidArgument);
179 CHECK_INTEGER_ARGUMENT(arguments, 2, &deadline, InvalidArgument); 193 CHECK_INTEGER_ARGUMENT(arguments, 2, &deadline, InvalidArgument);
180 194
181 MojoResult r = MojoWait(static_cast<MojoHandle>(handle), 195 MojoHandleSignalsState state;
182 static_cast<MojoHandleSignals>(signals), 196 MojoResult r = mojo::Wait(mojo::Handle(static_cast<MojoHandle>(handle)),
183 static_cast<MojoDeadline>(deadline)); 197 static_cast<MojoHandleSignals>(signals),
198 static_cast<MojoDeadline>(deadline), &state);
184 199
185 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(r)); 200 Dart_Handle klass = Dart_GetClass(
201 MojoLib(), Dart_NewStringFromCString("MojoHandleSignalsState"));
202 DART_CHECK_VALID(klass);
203
204 // The return value is structured as a list of length 2:
205 // [0] MojoResult
206 // [1] MojoHandleSignalsState. (may be null)
207 Dart_Handle list = Dart_NewList(2);
208 Dart_ListSetAt(list, 0, Dart_NewInteger(r));
209 if (mojo::WaitManyResult(r).AreSignalsStatesValid()) {
210 Dart_ListSetAt(list, 1, SignalsStateToDart(klass, state));
211 } else {
212 Dart_ListSetAt(list, 1, Dart_Null());
213 }
214 Dart_SetReturnValue(arguments, list);
186 } 215 }
187 216
188 void MojoHandle_WaitMany(Dart_NativeArguments arguments) { 217 void MojoHandle_WaitMany(Dart_NativeArguments arguments) {
189 int64_t num_handles = 0;
190 int64_t deadline = 0; 218 int64_t deadline = 0;
191 Dart_Handle handles = Dart_GetNativeArgument(arguments, 0); 219 Dart_Handle handles = Dart_GetNativeArgument(arguments, 0);
192 Dart_Handle signals = Dart_GetNativeArgument(arguments, 1); 220 Dart_Handle signals = Dart_GetNativeArgument(arguments, 1);
193 CHECK_INTEGER_ARGUMENT(arguments, 2, &num_handles, InvalidArgument); 221 CHECK_INTEGER_ARGUMENT(arguments, 2, &deadline, InvalidArgument);
194 CHECK_INTEGER_ARGUMENT(arguments, 3, &deadline, InvalidArgument);
195 222
196 if (!Dart_IsList(handles) || !Dart_IsList(signals)) { 223 if (!Dart_IsList(handles) || !Dart_IsList(signals)) {
197 SetInvalidArgumentReturn(arguments); 224 SetInvalidArgumentReturn(arguments);
198 return; 225 return;
199 } 226 }
200 227
201 intptr_t handles_len = 0; 228 intptr_t handles_len = 0;
202 intptr_t signals_len = 0; 229 intptr_t signals_len = 0;
203 Dart_ListLength(handles, &handles_len); 230 Dart_ListLength(handles, &handles_len);
204 Dart_ListLength(signals, &signals_len); 231 Dart_ListLength(signals, &signals_len);
205 if ((handles_len != num_handles) || (signals_len != num_handles)) { 232 if (handles_len != signals_len) {
206 SetInvalidArgumentReturn(arguments); 233 SetInvalidArgumentReturn(arguments);
207 return; 234 return;
208 } 235 }
209 236
210 scoped_ptr<MojoHandle[]> mojo_handles(new MojoHandle[num_handles]); 237 std::vector<mojo::Handle> mojo_handles(handles_len);
211 scoped_ptr<MojoHandleSignals[]> mojo_signals( 238 std::vector<MojoHandleSignals> mojo_signals(handles_len);
212 new MojoHandleSignals[num_handles]);
213 239
214 for (int i = 0; i < num_handles; i++) { 240 for (int i = 0; i < handles_len; i++) {
215 Dart_Handle dart_handle = Dart_ListGetAt(handles, i); 241 Dart_Handle dart_handle = Dart_ListGetAt(handles, i);
216 Dart_Handle dart_signal = Dart_ListGetAt(signals, i); 242 Dart_Handle dart_signal = Dart_ListGetAt(signals, i);
217 if (!Dart_IsInteger(dart_handle) || !Dart_IsInteger(dart_signal)) { 243 if (!Dart_IsInteger(dart_handle) || !Dart_IsInteger(dart_signal)) {
218 SetInvalidArgumentReturn(arguments); 244 SetInvalidArgumentReturn(arguments);
219 return; 245 return;
220 } 246 }
221 int64_t mojo_handle = 0; 247 int64_t mojo_handle = 0;
222 int64_t mojo_signal = 0; 248 int64_t mojo_signal = 0;
223 Dart_IntegerToInt64(dart_handle, &mojo_handle); 249 Dart_IntegerToInt64(dart_handle, &mojo_handle);
224 Dart_IntegerToInt64(dart_signal, &mojo_signal); 250 Dart_IntegerToInt64(dart_signal, &mojo_signal);
225 mojo_handles[i] = static_cast<MojoHandle>(mojo_handle); 251 mojo_handles[i] = mojo::Handle(mojo_handle);
226 mojo_signals[i] = static_cast<MojoHandleSignals>(mojo_signal); 252 mojo_signals[i] = static_cast<MojoHandleSignals>(mojo_signal);
227 } 253 }
228 254
229 MojoResult res = MojoWaitMany(mojo_handles.get(), mojo_signals.get(), 255 std::vector<MojoHandleSignalsState> states(handles_len);
230 static_cast<uint32_t>(num_handles), 256 mojo::WaitManyResult wmr = mojo::WaitMany(
231 static_cast<MojoDeadline>(deadline)); 257 mojo_handles, mojo_signals, static_cast<MojoDeadline>(deadline), &states);
232 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(res)); 258
259 Dart_Handle klass = Dart_GetClass(
260 MojoLib(), Dart_NewStringFromCString("MojoHandleSignalsState"));
261 DART_CHECK_VALID(klass);
262
263 // The return value is structured as a list of length 3:
264 // [0] MojoResult
265 // [1] index of handle that caused a return (may be null)
266 // [2] list of MojoHandleSignalsState. (may be null)
267 Dart_Handle list = Dart_NewList(3);
268 Dart_ListSetAt(list, 0, Dart_NewInteger(wmr.result));
269 if (wmr.IsIndexValid())
270 Dart_ListSetAt(list, 1, Dart_NewInteger(wmr.index));
271 else
272 Dart_ListSetAt(list, 1, Dart_Null());
273 if (wmr.AreSignalsStatesValid()) {
274 Dart_Handle stateList = Dart_NewList(handles_len);
275 for (int i = 0; i < handles_len; i++) {
276 Dart_ListSetAt(stateList, i, SignalsStateToDart(klass, states[i]));
277 }
278 Dart_ListSetAt(list, 2, stateList);
279 } else {
280 Dart_ListSetAt(list, 2, Dart_Null());
281 }
282 Dart_SetReturnValue(arguments, list);
233 } 283 }
234 284
235 void MojoSharedBuffer_Create(Dart_NativeArguments arguments) { 285 void MojoSharedBuffer_Create(Dart_NativeArguments arguments) {
236 int64_t num_bytes = 0; 286 int64_t num_bytes = 0;
237 int64_t flags = 0; 287 int64_t flags = 0;
238 CHECK_INTEGER_ARGUMENT(arguments, 0, &num_bytes, Null); 288 CHECK_INTEGER_ARGUMENT(arguments, 0, &num_bytes, Null);
239 CHECK_INTEGER_ARGUMENT(arguments, 1, &flags, Null); 289 CHECK_INTEGER_ARGUMENT(arguments, 1, &flags, Null);
240 290
241 MojoCreateSharedBufferOptions options; 291 MojoCreateSharedBufferOptions options;
242 options.struct_size = sizeof(MojoCreateSharedBufferOptions); 292 options.struct_size = sizeof(MojoCreateSharedBufferOptions);
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 mojo_control_handle = control_handle; 792 mojo_control_handle = control_handle;
743 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK)); 793 Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(MOJO_RESULT_OK));
744 } 794 }
745 795
746 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) { 796 void MojoHandleWatcher_GetControlHandle(Dart_NativeArguments arguments) {
747 Dart_SetIntegerReturnValue(arguments, mojo_control_handle); 797 Dart_SetIntegerReturnValue(arguments, mojo_control_handle);
748 } 798 }
749 799
750 } // namespace dart 800 } // namespace dart
751 } // namespace mojo 801 } // namespace mojo
OLDNEW
« no previous file with comments | « no previous file | mojo/dart/test/core_test.dart » ('j') | mojo/public/dart/src/handle_watcher.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698