From d5034ca889486d41382b47de4d3319315f76938b Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 3 May 2018 21:21:50 -0700 Subject: [PATCH] Set interrupted flag when throwing InterruptedIOE This avoids the interrupted flag being lost if the exception is handled as an IOException. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=195366244 --- .../ext/cronet/CronetDataSource.java | 20 ++++++++++--------- .../ext/okhttp/OkHttpDataSource.java | 2 +- .../upstream/DefaultHttpDataSource.java | 2 +- .../upstream/cache/CacheDataSource.java | 1 + 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java index 29bc874cd8..db980aa72b 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java @@ -280,6 +280,7 @@ public class CronetDataSource extends UrlRequest.Callback implements HttpDataSou new SocketTimeoutException(), dataSpec, getStatus(currentUrlRequest)); } } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new OpenException(new InterruptedIOException(e), dataSpec, Status.INVALID); } @@ -352,17 +353,18 @@ public class CronetDataSource extends UrlRequest.Callback implements HttpDataSou if (!operation.block(readTimeoutMs)) { throw new SocketTimeoutException(); } - } catch (InterruptedException | SocketTimeoutException e) { - // If we're timing out or getting interrupted, the operation is still ongoing. - // So we'll need to replace readBuffer to avoid the possibility of it being written to by - // this operation during a subsequent request. + } catch (InterruptedException e) { + // The operation is ongoing so replace readBuffer to avoid it being written to by this + // operation during a subsequent request. readBuffer = null; + Thread.currentThread().interrupt(); throw new HttpDataSourceException( - e instanceof InterruptedException - ? new InterruptedIOException((InterruptedException) e) - : (SocketTimeoutException) e, - currentDataSpec, - HttpDataSourceException.TYPE_READ); + new InterruptedIOException(e), currentDataSpec, HttpDataSourceException.TYPE_READ); + } catch (SocketTimeoutException e) { + // The operation is ongoing so replace readBuffer to avoid it being written to by this + // operation during a subsequent request. + readBuffer = null; + throw new HttpDataSourceException(e, currentDataSpec, HttpDataSourceException.TYPE_READ); } if (exception != null) { diff --git a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java index 0519673e50..172159b7af 100644 --- a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java +++ b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java @@ -325,7 +325,7 @@ public class OkHttpDataSource implements HttpDataSource { while (bytesSkipped != bytesToSkip) { int readLength = (int) Math.min(bytesToSkip - bytesSkipped, skipBuffer.length); int read = responseByteStream.read(skipBuffer, 0, readLength); - if (Thread.interrupted()) { + if (Thread.currentThread().isInterrupted()) { throw new InterruptedIOException(); } if (read == -1) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java index d45b7182c4..a47a5b5348 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java @@ -526,7 +526,7 @@ public class DefaultHttpDataSource implements HttpDataSource { while (bytesSkipped != bytesToSkip) { int readLength = (int) Math.min(bytesToSkip - bytesSkipped, skipBuffer.length); int read = inputStream.read(skipBuffer, 0, readLength); - if (Thread.interrupted()) { + if (Thread.currentThread().isInterrupted()) { throw new InterruptedIOException(); } if (read == -1) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java index fc080ef037..045fc25338 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java @@ -326,6 +326,7 @@ public final class CacheDataSource implements DataSource { try { nextSpan = cache.startReadWrite(key, readPosition); } catch (InterruptedException e) { + Thread.currentThread().interrupt(); throw new InterruptedIOException(); } } else {