Index: mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java |
diff --git a/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java b/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java |
index 173f80180f6639f25ef85991a409cb4ada75a49c..8330586714ab02779d4020b7a8ffbba3227be343 100644 |
--- a/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java |
+++ b/mojo/android/system/src/org/chromium/mojo/system/impl/CoreImpl.java |
@@ -8,7 +8,6 @@ |
import org.chromium.base.annotations.JNINamespace; |
import org.chromium.base.annotations.MainDex; |
import org.chromium.mojo.system.Core; |
-import org.chromium.mojo.system.Core.HandleSignalsState; |
import org.chromium.mojo.system.DataPipe; |
import org.chromium.mojo.system.DataPipe.ConsumerHandle; |
import org.chromium.mojo.system.DataPipe.ProducerHandle; |
@@ -28,6 +27,7 @@ |
import java.nio.ByteBuffer; |
import java.nio.ByteOrder; |
import java.util.ArrayList; |
+import java.util.Arrays; |
import java.util.List; |
/** |
@@ -88,6 +88,61 @@ |
@Override |
public long getTimeTicksNow() { |
return nativeGetTimeTicksNow(); |
+ } |
+ |
+ /** |
+ * @see Core#waitMany(List, long) |
+ */ |
+ @Override |
+ public WaitManyResult waitMany(List<Pair<Handle, HandleSignals>> handles, long deadline) { |
+ // Allocate a direct buffer to allow native code not to reach back to java. The buffer |
+ // layout will be: |
+ // input: The array of handles (int, 4 bytes each) |
+ // input: The array of signals (int, 4 bytes each) |
+ // space for output: The array of handle states (2 ints, 8 bytes each) |
+ // Space for output: The result index (int, 4 bytes) |
+ // The handles and signals will be filled before calling the native method. When the native |
+ // method returns, the handle states and the index will have been set. |
+ ByteBuffer buffer = allocateDirectBuffer(handles.size() * 16 + 4); |
+ int index = 0; |
+ for (Pair<Handle, HandleSignals> handle : handles) { |
+ buffer.putInt(HANDLE_SIZE * index, getMojoHandle(handle.first)); |
+ buffer.putInt( |
+ HANDLE_SIZE * handles.size() + FLAG_SIZE * index, handle.second.getFlags()); |
+ index++; |
+ } |
+ int code = nativeWaitMany(buffer, deadline); |
+ WaitManyResult result = new WaitManyResult(); |
+ result.setMojoResult(filterMojoResultForWait(code)); |
+ result.setHandleIndex(buffer.getInt(handles.size() * 16)); |
+ if (result.getMojoResult() != MojoResult.INVALID_ARGUMENT |
+ && result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED) { |
+ HandleSignalsState[] states = new HandleSignalsState[handles.size()]; |
+ for (int i = 0; i < handles.size(); ++i) { |
+ states[i] = new HandleSignalsState( |
+ new HandleSignals(buffer.getInt(8 * (handles.size() + i))), |
+ new HandleSignals(buffer.getInt(8 * (handles.size() + i) + 4))); |
+ } |
+ result.setSignalStates(Arrays.asList(states)); |
+ } |
+ return result; |
+ } |
+ |
+ /** |
+ * @see Core#wait(Handle, HandleSignals, long) |
+ */ |
+ @Override |
+ public WaitResult wait(Handle handle, HandleSignals signals, long deadline) { |
+ // Allocate a direct buffer to allow native code not to reach back to java. Buffer will |
+ // contain spaces to write the handle state. |
+ ByteBuffer buffer = allocateDirectBuffer(8); |
+ WaitResult result = new WaitResult(); |
+ result.setMojoResult(filterMojoResultForWait( |
+ nativeWait(buffer, getMojoHandle(handle), signals.getFlags(), deadline))); |
+ HandleSignalsState signalsState = new HandleSignalsState( |
+ new HandleSignals(buffer.getInt(0)), new HandleSignals(buffer.getInt(4))); |
+ result.setHandleSignalsState(signalsState); |
+ return result; |
} |
/** |
@@ -205,14 +260,6 @@ |
if (mojoResult != MojoResult.OK) { |
throw new MojoException(mojoResult); |
} |
- } |
- |
- HandleSignalsState queryHandleSignalsState(int mojoHandle) { |
- ByteBuffer buffer = allocateDirectBuffer(8); |
- int result = nativeQueryHandleSignalsState(mojoHandle, buffer); |
- if (result != MojoResult.OK) throw new MojoException(result); |
- return new HandleSignalsState( |
- new HandleSignals(buffer.getInt(0)), new HandleSignals(buffer.getInt(4))); |
} |
/** |
@@ -478,6 +525,8 @@ |
private native long nativeGetTimeTicksNow(); |
+ private native int nativeWaitMany(ByteBuffer buffer, long deadline); |
+ |
private native ResultAnd<IntegerPair> nativeCreateMessagePipe(ByteBuffer optionsBuffer); |
private native ResultAnd<IntegerPair> nativeCreateDataPipe(ByteBuffer optionsBuffer); |
@@ -487,7 +536,7 @@ |
private native int nativeClose(int mojoHandle); |
- private native int nativeQueryHandleSignalsState(int mojoHandle, ByteBuffer signalsStateBuffer); |
+ private native int nativeWait(ByteBuffer buffer, int mojoHandle, int signals, long deadline); |
private native int nativeWriteMessage( |
int mojoHandle, ByteBuffer bytes, int numBytes, ByteBuffer handlesBuffer, int flags); |