From f8b85739b13eb423e092fd8a0f7078527cf2f42b Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 4 Dec 2018 22:38:01 +0000 Subject: [PATCH] Fix race condition that could cause downloader not to be canceled PiperOrigin-RevId: 224048465 --- .../android/exoplayer2/offline/DownloadManager.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java index c5645bedf0..4a76c80d64 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java @@ -565,7 +565,7 @@ public final class DownloadManager { */ @TargetState private volatile int targetState; - @MonotonicNonNull private volatile Downloader downloader; + @MonotonicNonNull private Downloader downloader; @MonotonicNonNull private Thread thread; @MonotonicNonNull private Throwable error; @@ -624,6 +624,7 @@ public final class DownloadManager { state = STATE_STARTED; targetState = STATE_COMPLETED; downloadManager.onTaskStateChange(this); + downloader = downloaderFactory.createDownloader(action); thread = new Thread(this); thread.start(); } @@ -648,11 +649,7 @@ public final class DownloadManager { private void stopDownloadThread(@TargetState int targetState) { this.targetState = targetState; - // TODO: The possibility of downloader being null here may prevent the download thread from - // stopping in a timely way. Fix this. - if (downloader != null) { - downloader.cancel(); - } + Assertions.checkNotNull(downloader).cancel(); Assertions.checkNotNull(thread).interrupt(); } @@ -675,7 +672,6 @@ public final class DownloadManager { logd("Task is started", this); Throwable error = null; try { - downloader = downloaderFactory.createDownloader(action); if (action.isRemoveAction) { downloader.remove(); } else {