| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |