Chromium Code Reviews| Index: components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java |
| diff --git a/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java b/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java |
| index b07ad04843ce12ad2ca4caf26e19e84af86e2341..c5e3bd23a66c2ccdc87cbe5627406081fdd43138 100644 |
| --- a/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java |
| +++ b/components/cronet/android/api/src/org/chromium/net/JavaUrlRequest.java |
| @@ -290,7 +290,7 @@ final class JavaUrlRequest implements UrlRequest { |
| throw new IllegalStateException( |
| "Not expecting a read result, expecting: " + mSinkState.get()); |
| } |
| - mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() { |
| + mExecutor.execute(errorSetting(new CheckedRunnable() { |
| @Override |
| public void run() throws Exception { |
| mBuffer.flip(); |
| @@ -344,7 +344,7 @@ final class JavaUrlRequest implements UrlRequest { |
| } |
| void startRead() { |
| - mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() { |
| + mExecutor.execute(errorSetting(new CheckedRunnable() { |
| @Override |
| public void run() throws Exception { |
| if (mOutputChannel == null) { |
| @@ -432,30 +432,49 @@ final class JavaUrlRequest implements UrlRequest { |
| }); |
| } |
| - private void enterErrorState(State previousState, final UrlRequestException error) { |
| - if (mState.compareAndSet(previousState, State.ERROR)) { |
| + private void enterErrorState(final UrlRequestException error) { |
| + if (setTerminalState(State.ERROR)) { |
| fireDisconnect(); |
| fireCloseUploadDataProvider(); |
| mCallbackAsync.onFailed(mUrlResponseInfo, error); |
| } |
| } |
| + private boolean setTerminalState(State error) { |
| + while (true) { |
|
xunjieli
2016/09/02 21:05:01
I don't understand the need for a while-true loop.
Charles
2016/09/02 21:08:36
We're doing a compare-and-set continuously until w
xunjieli
2016/09/02 21:41:14
Acknowledged.
|
| + State oldState = mState.get(); |
| + switch (oldState) { |
| + case NOT_STARTED: |
| + throw new IllegalStateException("Can't enter error state before start"); |
| + case ERROR: // fallthrough |
| + case COMPLETE: // fallthrough |
| + case CANCELLED: |
| + return false; // Already in a terminal state |
| + default: { |
| + if (mState.compareAndSet(oldState, error)) { |
| + return true; |
| + } |
| + } |
| + } |
| + } |
| + } |
| + |
| /** Ends the request with an error, caused by an exception thrown from user code. */ |
| - private void enterUserErrorState(State previousState, final Throwable error) { |
| - enterErrorState(previousState, |
| + private void enterUserErrorState(final Throwable error) { |
| + enterErrorState( |
| new UrlRequestException("Exception received from UrlRequest.Callback", error)); |
| } |
| /** Ends the request with an error, caused by an exception thrown from user code. */ |
| private void enterUploadErrorState(final Throwable error) { |
| - enterErrorState(State.STARTED, |
| + enterErrorState( |
| new UrlRequestException("Exception received from UploadDataProvider", error)); |
| } |
| - private void enterCronetErrorState(State previousState, final Throwable error) { |
| + private void enterCronetErrorState(final Throwable error) { |
| // TODO(clm) mapping from Java exception (UnknownHostException, for example) to net error |
| // code goes here. |
| - enterErrorState(previousState, new UrlRequestException("System error", error)); |
| + enterErrorState(new UrlRequestException("System error", error)); |
| } |
| /** |
| @@ -490,7 +509,7 @@ final class JavaUrlRequest implements UrlRequest { |
| private void fireGetHeaders() { |
| mAdditionalStatusDetails = Status.WAITING_FOR_RESPONSE; |
| - mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() { |
| + mExecutor.execute(errorSetting(new CheckedRunnable() { |
| @Override |
| public void run() throws Exception { |
| HttpURLConnection connection = mCurrentUrlConnection.get(); |
| @@ -569,7 +588,7 @@ final class JavaUrlRequest implements UrlRequest { |
| } |
| private void fireOpenConnection() { |
| - mExecutor.execute(errorSetting(State.STARTED, new CheckedRunnable() { |
| + mExecutor.execute(errorSetting(new CheckedRunnable() { |
| @Override |
| public void run() throws Exception { |
| // If we're cancelled, then our old connection will be disconnected for us and |
| @@ -608,27 +627,27 @@ final class JavaUrlRequest implements UrlRequest { |
| })); |
| } |
| - private Runnable errorSetting(final State expectedState, final CheckedRunnable delegate) { |
| + private Runnable errorSetting(final CheckedRunnable delegate) { |
| return new Runnable() { |
| @Override |
| public void run() { |
| try { |
| delegate.run(); |
| } catch (Throwable t) { |
| - enterCronetErrorState(expectedState, t); |
| + enterCronetErrorState(t); |
| } |
| } |
| }; |
| } |
| - private Runnable userErrorSetting(final State expectedState, final CheckedRunnable delegate) { |
| + private Runnable userErrorSetting(final CheckedRunnable delegate) { |
| return new Runnable() { |
| @Override |
| public void run() { |
| try { |
| delegate.run(); |
| } catch (Throwable t) { |
| - enterUserErrorState(expectedState, t); |
| + enterUserErrorState(t); |
| } |
| } |
| }; |
| @@ -656,7 +675,7 @@ final class JavaUrlRequest implements UrlRequest { |
| transitionStates(State.AWAITING_READ, State.READING, new Runnable() { |
| @Override |
| public void run() { |
| - mExecutor.execute(errorSetting(State.READING, new CheckedRunnable() { |
| + mExecutor.execute(errorSetting(new CheckedRunnable() { |
| @Override |
| public void run() throws Exception { |
| int read = mResponseChannel.read(buffer); |
| @@ -781,17 +800,16 @@ final class JavaUrlRequest implements UrlRequest { |
| }); |
| } |
| - void execute(State currentState, CheckedRunnable runnable) { |
| + void execute(CheckedRunnable runnable) { |
| try { |
| - mUserExecutor.execute(userErrorSetting(currentState, runnable)); |
| + mUserExecutor.execute(userErrorSetting(runnable)); |
| } catch (RejectedExecutionException e) { |
| - enterErrorState(currentState, |
| - new UrlRequestException("Exception posting task to executor", e)); |
| + enterErrorState(new UrlRequestException("Exception posting task to executor", e)); |
| } |
| } |
| void onRedirectReceived(final UrlResponseInfo info, final String newLocationUrl) { |
| - execute(State.AWAITING_FOLLOW_REDIRECT, new CheckedRunnable() { |
| + execute(new CheckedRunnable() { |
| @Override |
| public void run() throws Exception { |
| mCallback.onRedirectReceived(JavaUrlRequest.this, info, newLocationUrl); |
| @@ -800,25 +818,25 @@ final class JavaUrlRequest implements UrlRequest { |
| } |
| void onResponseStarted(UrlResponseInfo info) { |
| - if (mState.compareAndSet(State.STARTED, State.AWAITING_READ)) { |
| - execute(State.AWAITING_READ, new CheckedRunnable() { |
| - @Override |
| - public void run() throws Exception { |
| + execute(new CheckedRunnable() { |
| + @Override |
| + public void run() throws Exception { |
| + if (mState.compareAndSet(State.STARTED, State.AWAITING_READ)) { |
| mCallback.onResponseStarted(JavaUrlRequest.this, mUrlResponseInfo); |
| } |
| - }); |
| - } |
| + } |
| + }); |
| } |
| void onReadCompleted(final UrlResponseInfo info, final ByteBuffer byteBuffer) { |
| - if (mState.compareAndSet(State.READING, State.AWAITING_READ)) { |
| - execute(State.AWAITING_READ, new CheckedRunnable() { |
| - @Override |
| - public void run() throws Exception { |
| + execute(new CheckedRunnable() { |
| + @Override |
| + public void run() throws Exception { |
| + if (mState.compareAndSet(State.READING, State.AWAITING_READ)) { |
| mCallback.onReadCompleted(JavaUrlRequest.this, info, byteBuffer); |
| } |
| - }); |
| - } |
| + } |
| + }); |
| } |
| void onCanceled(final UrlResponseInfo info) { |