| Index: mojo/dart/embedder/mojo_natives.cc
|
| diff --git a/mojo/dart/embedder/mojo_natives.cc b/mojo/dart/embedder/mojo_natives.cc
|
| index 9369e20988a8bbd02eef5195f38a3acb5579cde1..b506c80b09a8e110ae19ba70b03b34df6c1ebbe5 100644
|
| --- a/mojo/dart/embedder/mojo_natives.cc
|
| +++ b/mojo/dart/embedder/mojo_natives.cc
|
| @@ -11,33 +11,34 @@
|
| #include "dart/runtime/include/dart_api.h"
|
| #include "mojo/dart/embedder/builtin.h"
|
| #include "mojo/public/c/system/core.h"
|
| +#include "mojo/public/cpp/system/core.h"
|
|
|
| namespace mojo {
|
| namespace dart {
|
|
|
| -#define MOJO_NATIVE_LIST(V) \
|
| - V(MojoSharedBuffer_Create, 2) \
|
| - V(MojoSharedBuffer_Duplicate, 2) \
|
| - V(MojoSharedBuffer_Map, 5) \
|
| - V(MojoSharedBuffer_Unmap, 1) \
|
| - V(MojoDataPipe_Create, 3) \
|
| - V(MojoDataPipe_WriteData, 4) \
|
| - V(MojoDataPipe_BeginWriteData, 3) \
|
| - V(MojoDataPipe_EndWriteData, 2) \
|
| - V(MojoDataPipe_ReadData, 4) \
|
| - V(MojoDataPipe_BeginReadData, 3) \
|
| - V(MojoDataPipe_EndReadData, 2) \
|
| - V(MojoMessagePipe_Create, 1) \
|
| - V(MojoMessagePipe_Write, 5) \
|
| - V(MojoMessagePipe_Read, 5) \
|
| - V(MojoHandle_Close, 1) \
|
| - V(MojoHandle_Wait, 3) \
|
| - V(MojoHandle_Register, 1) \
|
| - V(MojoHandle_WaitMany, 4) \
|
| - V(MojoHandleWatcher_SendControlData, 4) \
|
| - V(MojoHandleWatcher_RecvControlData, 1) \
|
| - V(MojoHandleWatcher_SetControlHandle, 1) \
|
| - V(MojoHandleWatcher_GetControlHandle, 0) \
|
| +#define MOJO_NATIVE_LIST(V) \
|
| + V(MojoSharedBuffer_Create, 2) \
|
| + V(MojoSharedBuffer_Duplicate, 2) \
|
| + V(MojoSharedBuffer_Map, 5) \
|
| + V(MojoSharedBuffer_Unmap, 1) \
|
| + V(MojoDataPipe_Create, 3) \
|
| + V(MojoDataPipe_WriteData, 4) \
|
| + V(MojoDataPipe_BeginWriteData, 3) \
|
| + V(MojoDataPipe_EndWriteData, 2) \
|
| + V(MojoDataPipe_ReadData, 4) \
|
| + V(MojoDataPipe_BeginReadData, 3) \
|
| + V(MojoDataPipe_EndReadData, 2) \
|
| + V(MojoMessagePipe_Create, 1) \
|
| + V(MojoMessagePipe_Write, 5) \
|
| + V(MojoMessagePipe_Read, 5) \
|
| + V(MojoHandle_Close, 1) \
|
| + V(MojoHandle_Wait, 3) \
|
| + V(MojoHandle_Register, 1) \
|
| + V(MojoHandle_WaitMany, 3) \
|
| + V(MojoHandleWatcher_SendControlData, 4) \
|
| + V(MojoHandleWatcher_RecvControlData, 1) \
|
| + V(MojoHandleWatcher_SetControlHandle, 1) \
|
| + V(MojoHandleWatcher_GetControlHandle, 0)
|
|
|
| MOJO_NATIVE_LIST(DECLARE_FUNCTION);
|
|
|
| @@ -87,6 +88,19 @@ static void SetInvalidArgumentReturn(Dart_NativeArguments arguments) {
|
| arguments, static_cast<int64_t>(MOJO_RESULT_INVALID_ARGUMENT));
|
| }
|
|
|
| +static Dart_Handle MojoLib() {
|
| + Dart_Handle core_lib_name = Dart_NewStringFromCString("dart:mojo_core");
|
| + return Dart_LookupLibrary(core_lib_name);
|
| +}
|
| +
|
| +static Dart_Handle SignalsStateToDart(Dart_Handle klass,
|
| + const MojoHandleSignalsState& state) {
|
| + Dart_Handle arg1 = Dart_NewInteger(state.satisfied_signals);
|
| + Dart_Handle arg2 = Dart_NewInteger(state.satisfiable_signals);
|
| + Dart_Handle args[] = {arg1, arg2};
|
| + return Dart_New(klass, Dart_Null(), 2, args);
|
| +}
|
| +
|
| #define CHECK_INTEGER_ARGUMENT(args, num, result, failure) \
|
| { \
|
| Dart_Handle __status; \
|
| @@ -178,20 +192,33 @@ void MojoHandle_Wait(Dart_NativeArguments arguments) {
|
| CHECK_INTEGER_ARGUMENT(arguments, 1, &signals, InvalidArgument);
|
| CHECK_INTEGER_ARGUMENT(arguments, 2, &deadline, InvalidArgument);
|
|
|
| - MojoResult r = MojoWait(static_cast<MojoHandle>(handle),
|
| - static_cast<MojoHandleSignals>(signals),
|
| - static_cast<MojoDeadline>(deadline));
|
| + MojoHandleSignalsState state;
|
| + MojoResult r = mojo::Wait(mojo::Handle(static_cast<MojoHandle>(handle)),
|
| + static_cast<MojoHandleSignals>(signals),
|
| + static_cast<MojoDeadline>(deadline), &state);
|
| +
|
| + Dart_Handle klass = Dart_GetClass(
|
| + MojoLib(), Dart_NewStringFromCString("MojoHandleSignalsState"));
|
| + DART_CHECK_VALID(klass);
|
|
|
| - Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(r));
|
| + // The return value is structured as a list of length 2:
|
| + // [0] MojoResult
|
| + // [1] MojoHandleSignalsState. (may be null)
|
| + Dart_Handle list = Dart_NewList(2);
|
| + Dart_ListSetAt(list, 0, Dart_NewInteger(r));
|
| + if (mojo::WaitManyResult(r).AreSignalsStatesValid()) {
|
| + Dart_ListSetAt(list, 1, SignalsStateToDart(klass, state));
|
| + } else {
|
| + Dart_ListSetAt(list, 1, Dart_Null());
|
| + }
|
| + Dart_SetReturnValue(arguments, list);
|
| }
|
|
|
| void MojoHandle_WaitMany(Dart_NativeArguments arguments) {
|
| - int64_t num_handles = 0;
|
| int64_t deadline = 0;
|
| Dart_Handle handles = Dart_GetNativeArgument(arguments, 0);
|
| Dart_Handle signals = Dart_GetNativeArgument(arguments, 1);
|
| - CHECK_INTEGER_ARGUMENT(arguments, 2, &num_handles, InvalidArgument);
|
| - CHECK_INTEGER_ARGUMENT(arguments, 3, &deadline, InvalidArgument);
|
| + CHECK_INTEGER_ARGUMENT(arguments, 2, &deadline, InvalidArgument);
|
|
|
| if (!Dart_IsList(handles) || !Dart_IsList(signals)) {
|
| SetInvalidArgumentReturn(arguments);
|
| @@ -202,16 +229,15 @@ void MojoHandle_WaitMany(Dart_NativeArguments arguments) {
|
| intptr_t signals_len = 0;
|
| Dart_ListLength(handles, &handles_len);
|
| Dart_ListLength(signals, &signals_len);
|
| - if ((handles_len != num_handles) || (signals_len != num_handles)) {
|
| + if (handles_len != signals_len) {
|
| SetInvalidArgumentReturn(arguments);
|
| return;
|
| }
|
|
|
| - scoped_ptr<MojoHandle[]> mojo_handles(new MojoHandle[num_handles]);
|
| - scoped_ptr<MojoHandleSignals[]> mojo_signals(
|
| - new MojoHandleSignals[num_handles]);
|
| + std::vector<mojo::Handle> mojo_handles(handles_len);
|
| + std::vector<MojoHandleSignals> mojo_signals(handles_len);
|
|
|
| - for (int i = 0; i < num_handles; i++) {
|
| + for (int i = 0; i < handles_len; i++) {
|
| Dart_Handle dart_handle = Dart_ListGetAt(handles, i);
|
| Dart_Handle dart_signal = Dart_ListGetAt(signals, i);
|
| if (!Dart_IsInteger(dart_handle) || !Dart_IsInteger(dart_signal)) {
|
| @@ -222,14 +248,38 @@ void MojoHandle_WaitMany(Dart_NativeArguments arguments) {
|
| int64_t mojo_signal = 0;
|
| Dart_IntegerToInt64(dart_handle, &mojo_handle);
|
| Dart_IntegerToInt64(dart_signal, &mojo_signal);
|
| - mojo_handles[i] = static_cast<MojoHandle>(mojo_handle);
|
| + mojo_handles[i] = mojo::Handle(mojo_handle);
|
| mojo_signals[i] = static_cast<MojoHandleSignals>(mojo_signal);
|
| }
|
|
|
| - MojoResult res = MojoWaitMany(mojo_handles.get(), mojo_signals.get(),
|
| - static_cast<uint32_t>(num_handles),
|
| - static_cast<MojoDeadline>(deadline));
|
| - Dart_SetIntegerReturnValue(arguments, static_cast<int64_t>(res));
|
| + std::vector<MojoHandleSignalsState> states(handles_len);
|
| + mojo::WaitManyResult wmr = mojo::WaitMany(
|
| + mojo_handles, mojo_signals, static_cast<MojoDeadline>(deadline), &states);
|
| +
|
| + Dart_Handle klass = Dart_GetClass(
|
| + MojoLib(), Dart_NewStringFromCString("MojoHandleSignalsState"));
|
| + DART_CHECK_VALID(klass);
|
| +
|
| + // The return value is structured as a list of length 3:
|
| + // [0] MojoResult
|
| + // [1] index of handle that caused a return (may be null)
|
| + // [2] list of MojoHandleSignalsState. (may be null)
|
| + Dart_Handle list = Dart_NewList(3);
|
| + Dart_ListSetAt(list, 0, Dart_NewInteger(wmr.result));
|
| + if (wmr.IsIndexValid())
|
| + Dart_ListSetAt(list, 1, Dart_NewInteger(wmr.index));
|
| + else
|
| + Dart_ListSetAt(list, 1, Dart_Null());
|
| + if (wmr.AreSignalsStatesValid()) {
|
| + Dart_Handle stateList = Dart_NewList(handles_len);
|
| + for (int i = 0; i < handles_len; i++) {
|
| + Dart_ListSetAt(stateList, i, SignalsStateToDart(klass, states[i]));
|
| + }
|
| + Dart_ListSetAt(list, 2, stateList);
|
| + } else {
|
| + Dart_ListSetAt(list, 2, Dart_Null());
|
| + }
|
| + Dart_SetReturnValue(arguments, list);
|
| }
|
|
|
| void MojoSharedBuffer_Create(Dart_NativeArguments arguments) {
|
|
|