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 a32e1f347b88ff0f8cfffda40a7ba5d9c890d13c..86ad0cd8689465cd455a5fc7726b09d78a534945 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 |
@@ -16,6 +16,7 @@ import org.chromium.mojo.system.MessagePipeHandle; |
import org.chromium.mojo.system.MojoException; |
import org.chromium.mojo.system.MojoResult; |
import org.chromium.mojo.system.Pair; |
+import org.chromium.mojo.system.ResultAnd; |
import org.chromium.mojo.system.RunLoop; |
import org.chromium.mojo.system.SharedBufferHandle; |
import org.chromium.mojo.system.SharedBufferHandle.DuplicateOptions; |
@@ -144,13 +145,13 @@ public class CoreImpl implements Core, AsyncWaiter { |
optionsBuffer.putInt(0, 8); |
optionsBuffer.putInt(4, options.getFlags().getFlags()); |
} |
- NativeCreationResult result = nativeCreateMessagePipe(optionsBuffer); |
+ ResultAnd<IntegerPair> result = nativeCreateMessagePipe(optionsBuffer); |
if (result.getMojoResult() != MojoResult.OK) { |
throw new MojoException(result.getMojoResult()); |
} |
return Pair.<MessagePipeHandle, MessagePipeHandle>create( |
- new MessagePipeHandleImpl(this, result.getMojoHandle1()), |
- new MessagePipeHandleImpl(this, result.getMojoHandle2())); |
+ new MessagePipeHandleImpl(this, result.getValue().first), |
+ new MessagePipeHandleImpl(this, result.getValue().second)); |
} |
/** |
@@ -166,13 +167,13 @@ public class CoreImpl implements Core, AsyncWaiter { |
optionsBuffer.putInt(8, options.getElementNumBytes()); |
optionsBuffer.putInt(12, options.getCapacityNumBytes()); |
} |
- NativeCreationResult result = nativeCreateDataPipe(optionsBuffer); |
+ ResultAnd<IntegerPair> result = nativeCreateDataPipe(optionsBuffer); |
if (result.getMojoResult() != MojoResult.OK) { |
throw new MojoException(result.getMojoResult()); |
} |
return Pair.<ProducerHandle, ConsumerHandle>create( |
- new DataPipeProducerHandleImpl(this, result.getMojoHandle1()), |
- new DataPipeConsumerHandleImpl(this, result.getMojoHandle2())); |
+ new DataPipeProducerHandleImpl(this, result.getValue().first), |
+ new DataPipeConsumerHandleImpl(this, result.getValue().second)); |
} |
/** |
@@ -187,12 +188,11 @@ public class CoreImpl implements Core, AsyncWaiter { |
optionsBuffer.putInt(0, 8); |
optionsBuffer.putInt(4, options.getFlags().getFlags()); |
} |
- NativeCreationResult result = nativeCreateSharedBuffer(optionsBuffer, numBytes); |
+ ResultAnd<Integer> result = nativeCreateSharedBuffer(optionsBuffer, numBytes); |
if (result.getMojoResult() != MojoResult.OK) { |
throw new MojoException(result.getMojoResult()); |
} |
- assert result.getMojoHandle2() == 0; |
- return new SharedBufferHandleImpl(this, result.getMojoHandle1()); |
+ return new SharedBufferHandleImpl(this, result.getValue()); |
} |
/** |
@@ -290,13 +290,13 @@ public class CoreImpl implements Core, AsyncWaiter { |
/** |
* @see MessagePipeHandle#readMessage(ByteBuffer, int, MessagePipeHandle.ReadFlags) |
*/ |
- MessagePipeHandle.ReadMessageResult readMessage(MessagePipeHandleImpl handle, ByteBuffer bytes, |
- int maxNumberOfHandles, MessagePipeHandle.ReadFlags flags) { |
+ ResultAnd<MessagePipeHandle.ReadMessageResult> readMessage(MessagePipeHandleImpl handle, |
+ ByteBuffer bytes, int maxNumberOfHandles, MessagePipeHandle.ReadFlags flags) { |
ByteBuffer handlesBuffer = null; |
if (maxNumberOfHandles > 0) { |
handlesBuffer = allocateDirectBuffer(maxNumberOfHandles * HANDLE_SIZE); |
} |
- MessagePipeHandle.ReadMessageResult result = |
+ ResultAnd<MessagePipeHandle.ReadMessageResult> result = |
nativeReadMessage(handle.getMojoHandle(), bytes, handlesBuffer, flags.getFlags()); |
if (result.getMojoResult() != MojoResult.OK |
&& result.getMojoResult() != MojoResult.RESOURCE_EXHAUSTED |
@@ -305,17 +305,19 @@ public class CoreImpl implements Core, AsyncWaiter { |
} |
if (result.getMojoResult() == MojoResult.OK) { |
+ MessagePipeHandle.ReadMessageResult readResult = result.getValue(); |
if (bytes != null) { |
bytes.position(0); |
- bytes.limit(result.getMessageSize()); |
+ bytes.limit(readResult.getMessageSize()); |
} |
- List<UntypedHandle> handles = new ArrayList<UntypedHandle>(result.getHandlesCount()); |
- for (int i = 0; i < result.getHandlesCount(); ++i) { |
+ List<UntypedHandle> handles = |
+ new ArrayList<UntypedHandle>(readResult.getHandlesCount()); |
+ for (int i = 0; i < readResult.getHandlesCount(); ++i) { |
int mojoHandle = handlesBuffer.getInt(HANDLE_SIZE * i); |
handles.add(new UntypedHandleImpl(this, mojoHandle)); |
} |
- result.setHandles(handles); |
+ readResult.setHandles(handles); |
} |
return result; |
} |
@@ -324,25 +326,29 @@ public class CoreImpl implements Core, AsyncWaiter { |
* @see ConsumerHandle#discardData(int, DataPipe.ReadFlags) |
*/ |
int discardData(DataPipeConsumerHandleImpl handle, int numBytes, DataPipe.ReadFlags flags) { |
- int result = nativeReadData(handle.getMojoHandle(), null, numBytes, |
+ ResultAnd<Integer> result = nativeReadData(handle.getMojoHandle(), null, numBytes, |
flags.getFlags() | MOJO_READ_DATA_FLAG_DISCARD); |
- if (result < 0) { |
- throw new MojoException(result); |
+ if (result.getMojoResult() != MojoResult.OK) { |
+ throw new MojoException(result.getMojoResult()); |
} |
- return result; |
+ return result.getValue(); |
} |
/** |
* @see ConsumerHandle#readData(ByteBuffer, DataPipe.ReadFlags) |
*/ |
- int readData(DataPipeConsumerHandleImpl handle, ByteBuffer elements, DataPipe.ReadFlags flags) { |
- int result = nativeReadData(handle.getMojoHandle(), elements, |
+ ResultAnd<Integer> readData( |
+ DataPipeConsumerHandleImpl handle, ByteBuffer elements, DataPipe.ReadFlags flags) { |
+ ResultAnd<Integer> result = nativeReadData(handle.getMojoHandle(), elements, |
elements == null ? 0 : elements.capacity(), flags.getFlags()); |
- if (result < 0) { |
- throw new MojoException(result); |
+ if (result.getMojoResult() != MojoResult.OK |
+ && result.getMojoResult() != MojoResult.SHOULD_WAIT) { |
+ throw new MojoException(result.getMojoResult()); |
} |
- if (elements != null) { |
- elements.limit(result); |
+ if (result.getMojoResult() == MojoResult.OK) { |
+ if (elements != null) { |
+ elements.limit(result.getValue()); |
+ } |
} |
return result; |
} |
@@ -352,12 +358,12 @@ public class CoreImpl implements Core, AsyncWaiter { |
*/ |
ByteBuffer beginReadData( |
DataPipeConsumerHandleImpl handle, int numBytes, DataPipe.ReadFlags flags) { |
- NativeCodeAndBufferResult result = |
+ ResultAnd<ByteBuffer> result = |
nativeBeginReadData(handle.getMojoHandle(), numBytes, flags.getFlags()); |
if (result.getMojoResult() != MojoResult.OK) { |
throw new MojoException(result.getMojoResult()); |
} |
- return result.getBuffer().asReadOnlyBuffer(); |
+ return result.getValue().asReadOnlyBuffer(); |
} |
/** |
@@ -373,7 +379,7 @@ public class CoreImpl implements Core, AsyncWaiter { |
/** |
* @see ProducerHandle#writeData(ByteBuffer, DataPipe.WriteFlags) |
*/ |
- int writeData( |
+ ResultAnd<Integer> writeData( |
DataPipeProducerHandleImpl handle, ByteBuffer elements, DataPipe.WriteFlags flags) { |
return nativeWriteData( |
handle.getMojoHandle(), elements, elements.limit(), flags.getFlags()); |
@@ -384,12 +390,12 @@ public class CoreImpl implements Core, AsyncWaiter { |
*/ |
ByteBuffer beginWriteData( |
DataPipeProducerHandleImpl handle, int numBytes, DataPipe.WriteFlags flags) { |
- NativeCodeAndBufferResult result = |
+ ResultAnd<ByteBuffer> result = |
nativeBeginWriteData(handle.getMojoHandle(), numBytes, flags.getFlags()); |
if (result.getMojoResult() != MojoResult.OK) { |
throw new MojoException(result.getMojoResult()); |
} |
- return result.getBuffer(); |
+ return result.getValue(); |
} |
/** |
@@ -412,24 +418,23 @@ public class CoreImpl implements Core, AsyncWaiter { |
optionsBuffer.putInt(0, 8); |
optionsBuffer.putInt(4, options.getFlags().getFlags()); |
} |
- NativeCreationResult result = nativeDuplicate(handle.getMojoHandle(), optionsBuffer); |
+ ResultAnd<Integer> result = nativeDuplicate(handle.getMojoHandle(), optionsBuffer); |
if (result.getMojoResult() != MojoResult.OK) { |
throw new MojoException(result.getMojoResult()); |
} |
- assert result.getMojoHandle2() == 0; |
- return new SharedBufferHandleImpl(this, result.getMojoHandle1()); |
+ return new SharedBufferHandleImpl(this, result.getValue()); |
} |
/** |
* @see SharedBufferHandle#map(long, long, MapFlags) |
*/ |
ByteBuffer map(SharedBufferHandleImpl handle, long offset, long numBytes, MapFlags flags) { |
- NativeCodeAndBufferResult result = |
+ ResultAnd<ByteBuffer> result = |
nativeMap(handle.getMojoHandle(), offset, numBytes, flags.getFlags()); |
if (result.getMojoResult() != MojoResult.OK) { |
throw new MojoException(result.getMojoResult()); |
} |
- return result.getBuffer(); |
+ return result.getValue(); |
} |
/** |
@@ -477,39 +482,6 @@ public class CoreImpl implements Core, AsyncWaiter { |
return buffer; |
} |
- private static class NativeCodeAndBufferResult { |
- private int mMojoResult; |
- private ByteBuffer mBuffer; |
- |
- /** |
- * @return the mojoResult |
- */ |
- public int getMojoResult() { |
- return mMojoResult; |
- } |
- |
- /** |
- * @param mojoResult the mojoResult to set |
- */ |
- public void setMojoResult(int mojoResult) { |
- mMojoResult = mojoResult; |
- } |
- |
- /** |
- * @return the buffer |
- */ |
- public ByteBuffer getBuffer() { |
- return mBuffer; |
- } |
- |
- /** |
- * @param buffer the buffer to set |
- */ |
- public void setBuffer(ByteBuffer buffer) { |
- mBuffer = buffer; |
- } |
- } |
- |
/** |
* Implementation of {@link org.chromium.mojo.system.AsyncWaiter.Cancellable}. |
*/ |
@@ -564,95 +536,49 @@ public class CoreImpl implements Core, AsyncWaiter { |
} |
@CalledByNative |
- private static NativeCodeAndBufferResult newNativeCodeAndBufferResult( |
- int mojoResult, ByteBuffer buffer) { |
- NativeCodeAndBufferResult result = new NativeCodeAndBufferResult(); |
- result.setMojoResult(mojoResult); |
- result.setBuffer(buffer); |
- return result; |
+ private static ResultAnd<ByteBuffer> newResultAndBuffer(int mojoResult, ByteBuffer buffer) { |
+ return new ResultAnd<>(mojoResult, buffer); |
+ } |
+ |
+ /** |
+ * Trivial alias for Pair<Integer, Integer>. This is needed because our jni generator is unable |
+ * to handle class that contains space. |
+ */ |
+ private static final class IntegerPair extends Pair<Integer, Integer> { |
+ public IntegerPair(Integer first, Integer second) { |
+ super(first, second); |
+ } |
} |
@CalledByNative |
- private static MessagePipeHandle.ReadMessageResult newReadMessageResult( |
+ private static ResultAnd<MessagePipeHandle.ReadMessageResult> newReadMessageResult( |
int mojoResult, int messageSize, int handlesCount) { |
MessagePipeHandle.ReadMessageResult result = new MessagePipeHandle.ReadMessageResult(); |
- if (mojoResult >= 0) { |
- result.setMojoResult(MojoResult.OK); |
- } else { |
- result.setMojoResult(mojoResult); |
- } |
result.setMessageSize(messageSize); |
result.setHandlesCount(handlesCount); |
- return result; |
+ return new ResultAnd<>(mojoResult, result); |
} |
- private static class NativeCreationResult { |
- private int mMojoResult; |
- private int mMojoHandle1; |
- private int mMojoHandle2; |
- |
- /** |
- * @return the mojoResult |
- */ |
- public int getMojoResult() { |
- return mMojoResult; |
- } |
- |
- /** |
- * @param mojoResult the mojoResult to set |
- */ |
- public void setMojoResult(int mojoResult) { |
- mMojoResult = mojoResult; |
- } |
- |
- /** |
- * @return the mojoHandle1 |
- */ |
- public int getMojoHandle1() { |
- return mMojoHandle1; |
- } |
- |
- /** |
- * @param mojoHandle1 the mojoHandle1 to set |
- */ |
- public void setMojoHandle1(int mojoHandle1) { |
- mMojoHandle1 = mojoHandle1; |
- } |
- |
- /** |
- * @return the mojoHandle2 |
- */ |
- public int getMojoHandle2() { |
- return mMojoHandle2; |
- } |
- |
- /** |
- * @param mojoHandle2 the mojoHandle2 to set |
- */ |
- public void setMojoHandle2(int mojoHandle2) { |
- mMojoHandle2 = mojoHandle2; |
- } |
+ @CalledByNative |
+ private static ResultAnd<Integer> newResultAndInteger(int mojoResult, int numBytesRead) { |
+ return new ResultAnd<>(mojoResult, numBytesRead); |
} |
@CalledByNative |
- private static NativeCreationResult newNativeCreationResult( |
+ private static ResultAnd<IntegerPair> newNativeCreationResult( |
int mojoResult, int mojoHandle1, int mojoHandle2) { |
- NativeCreationResult result = new NativeCreationResult(); |
- result.setMojoResult(mojoResult); |
- result.setMojoHandle1(mojoHandle1); |
- result.setMojoHandle2(mojoHandle2); |
- return result; |
+ return new ResultAnd<>(mojoResult, new IntegerPair(mojoHandle1, mojoHandle2)); |
} |
private native long nativeGetTimeTicksNow(); |
private native int nativeWaitMany(ByteBuffer buffer, long deadline); |
- private native NativeCreationResult nativeCreateMessagePipe(ByteBuffer optionsBuffer); |
+ private native ResultAnd<IntegerPair> nativeCreateMessagePipe(ByteBuffer optionsBuffer); |
- private native NativeCreationResult nativeCreateDataPipe(ByteBuffer optionsBuffer); |
+ private native ResultAnd<IntegerPair> nativeCreateDataPipe(ByteBuffer optionsBuffer); |
- private native NativeCreationResult nativeCreateSharedBuffer( |
+ private native ResultAnd<Integer> nativeCreateSharedBuffer( |
ByteBuffer optionsBuffer, long numBytes); |
private native int nativeClose(int mojoHandle); |
@@ -662,27 +588,28 @@ public class CoreImpl implements Core, AsyncWaiter { |
private native int nativeWriteMessage( |
int mojoHandle, ByteBuffer bytes, int numBytes, ByteBuffer handlesBuffer, int flags); |
- private native MessagePipeHandle.ReadMessageResult nativeReadMessage( |
+ private native ResultAnd<MessagePipeHandle.ReadMessageResult> nativeReadMessage( |
int mojoHandle, ByteBuffer bytes, ByteBuffer handlesBuffer, int flags); |
- private native int nativeReadData( |
+ private native ResultAnd<Integer> nativeReadData( |
int mojoHandle, ByteBuffer elements, int elementsSize, int flags); |
- private native NativeCodeAndBufferResult nativeBeginReadData( |
+ private native ResultAnd<ByteBuffer> nativeBeginReadData( |
int mojoHandle, int numBytes, int flags); |
private native int nativeEndReadData(int mojoHandle, int numBytesRead); |
- private native int nativeWriteData(int mojoHandle, ByteBuffer elements, int limit, int flags); |
+ private native ResultAnd<Integer> nativeWriteData( |
+ int mojoHandle, ByteBuffer elements, int limit, int flags); |
- private native NativeCodeAndBufferResult nativeBeginWriteData( |
+ private native ResultAnd<ByteBuffer> nativeBeginWriteData( |
int mojoHandle, int numBytes, int flags); |
private native int nativeEndWriteData(int mojoHandle, int numBytesWritten); |
- private native NativeCreationResult nativeDuplicate(int mojoHandle, ByteBuffer optionsBuffer); |
+ private native ResultAnd<Integer> nativeDuplicate(int mojoHandle, ByteBuffer optionsBuffer); |
- private native NativeCodeAndBufferResult nativeMap( |
+ private native ResultAnd<ByteBuffer> nativeMap( |
int mojoHandle, long offset, long numBytes, int flags); |
private native int nativeUnmap(ByteBuffer buffer); |