From 16dfc07a8e32110989bcb445e911041fb5550a66 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sun, 29 Dec 2019 14:29:36 +0100 Subject: [PATCH] Use AtomicBoolen to indicate, if a download has finished --- .../recorder/download/dash/DashDownload.java | 14 ++++++++------ .../recorder/download/hls/AbstractHlsDownload.java | 6 +++--- .../ctbrec/recorder/download/hls/HlsDownload.java | 8 ++++++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/ctbrec/recorder/download/dash/DashDownload.java b/common/src/main/java/ctbrec/recorder/download/dash/DashDownload.java index 27ddccb2..f7ed3ba8 100644 --- a/common/src/main/java/ctbrec/recorder/download/dash/DashDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/dash/DashDownload.java @@ -21,6 +21,7 @@ import java.util.Locale; import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import javax.xml.bind.JAXBContext; @@ -56,7 +57,7 @@ public class DashDownload extends AbstractDownload { private boolean audioInitLoaded = false; private BigInteger lastAudioTimestamp = BigInteger.ZERO; private BigInteger lastVideoTimestamp = BigInteger.ZERO; - private transient Object downloadFinished = new Object(); + private transient AtomicBoolean downloadFinished = new AtomicBoolean(false); private transient HttpClient httpClient; private transient Config config; private Model model; @@ -255,11 +256,11 @@ public class DashDownload extends AbstractDownload { break; } } - } catch(HttpException e) { - if(e.getResponseCode() == 404) { + } catch (HttpException e) { + if (e.getResponseCode() == 404) { LOG.debug("Manifest not found (404). Model {} probably went offline", model); waitSomeTime(10_000); - } else if(e.getResponseCode() == 403) { + } else if (e.getResponseCode() == 403) { LOG.debug("Manifest access forbidden (403). Model {} probably went private or offline", model); waitSomeTime(10_000); } else { @@ -270,6 +271,7 @@ public class DashDownload extends AbstractDownload { } finally { running = false; endTime = Instant.now(); + downloadFinished.set(true); synchronized (downloadFinished) { downloadFinished.notifyAll(); } @@ -348,8 +350,8 @@ public class DashDownload extends AbstractDownload { if (running) { internalStop(); try { - while (running) { - synchronized (downloadFinished) { + synchronized (downloadFinished) { + while (!downloadFinished.get()) { downloadFinished.wait(TimeUnit.SECONDS.toMillis(1)); } } diff --git a/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java b/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java index a461ef8f..b65d8c39 100644 --- a/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/hls/AbstractHlsDownload.java @@ -52,11 +52,11 @@ public abstract class AbstractHlsDownload extends AbstractDownload { private static final Logger LOG = LoggerFactory.getLogger(AbstractHlsDownload.class); private static int threadCounter = 0; - protected HttpClient client; + protected transient HttpClient client; protected volatile boolean running = false; protected Model model = new UnknownModel(); - protected LinkedBlockingQueue downloadQueue = new LinkedBlockingQueue<>(50); - protected ExecutorService downloadThreadPool = new ThreadPoolExecutor(5, 5, 2, TimeUnit.MINUTES, downloadQueue, createThreadFactory()); + protected transient LinkedBlockingQueue downloadQueue = new LinkedBlockingQueue<>(50); + protected transient ExecutorService downloadThreadPool = new ThreadPoolExecutor(5, 5, 2, TimeUnit.MINUTES, downloadQueue, createThreadFactory()); protected State state = State.UNKNOWN; private int playlistEmptyCount = 0; diff --git a/common/src/main/java/ctbrec/recorder/download/hls/HlsDownload.java b/common/src/main/java/ctbrec/recorder/download/hls/HlsDownload.java index d78d19ab..99323dac 100644 --- a/common/src/main/java/ctbrec/recorder/download/hls/HlsDownload.java +++ b/common/src/main/java/ctbrec/recorder/download/hls/HlsDownload.java @@ -24,6 +24,7 @@ import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.regex.Pattern; import org.slf4j.Logger; @@ -57,7 +58,7 @@ public class HlsDownload extends AbstractHlsDownload { private int segmentCounter = 1; private NumberFormat nf = new DecimalFormat("000000"); - private transient Object downloadFinished = new Object(); + private transient AtomicBoolean downloadFinished = new AtomicBoolean(false); private ZonedDateTime splitRecStartTime; private transient Config config; @@ -171,6 +172,7 @@ public class HlsDownload extends AbstractHlsDownload { } catch (InterruptedException e) { Thread.currentThread().interrupt(); } + downloadFinished.set(true); synchronized (downloadFinished) { downloadFinished.notifyAll(); } @@ -242,7 +244,9 @@ public class HlsDownload extends AbstractHlsDownload { internalStop(); try { synchronized (downloadFinished) { - downloadFinished.wait(TimeUnit.SECONDS.toMillis(60)); + while (!downloadFinished.get()) { + downloadFinished.wait(TimeUnit.SECONDS.toMillis(60)); + } } } catch (InterruptedException e) { Thread.currentThread().interrupt();