From 1ba588272c91e8ec59847311e1cb083be6a3a316 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Wed, 8 Feb 2023 12:06:51 +0100 Subject: [PATCH] Get `Waiting` downloads before `Active` ones. `Waiting` can become `Active` while we are getting the downloads. We may have rare case where we miss a download if we get `Active` before `Waiting`. --- src/downloader.cpp | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/downloader.cpp b/src/downloader.cpp index 2035cecf3..d874ad899 100644 --- a/src/downloader.cpp +++ b/src/downloader.cpp @@ -127,14 +127,6 @@ void Download::cancelDownload() Downloader::Downloader() : mp_aria(new Aria2()) { - try { - for (auto gid : mp_aria->tellActive()) { - m_knownDownloads[gid] = std::unique_ptr(new Download(mp_aria, gid)); - m_knownDownloads[gid]->updateStatus(false); - } - } catch (std::exception& e) { - std::cerr << "aria2 tellActive failed : " << e.what() << std::endl; - } try { for (auto gid : mp_aria->tellWaiting()) { m_knownDownloads[gid] = std::unique_ptr(new Download(mp_aria, gid)); @@ -143,6 +135,16 @@ Downloader::Downloader() : } catch (std::exception& e) { std::cerr << "aria2 tellWaiting failed : " << e.what() << std::endl; } + try { + for (auto gid : mp_aria->tellActive()) { + if( m_knownDownloads.find(gid) == m_knownDownloads.end()) { + m_knownDownloads[gid] = std::unique_ptr(new Download(mp_aria, gid)); + m_knownDownloads[gid]->updateStatus(false); + } + } + } catch (std::exception& e) { + std::cerr << "aria2 tellActive failed : " << e.what() << std::endl; + } } /* Destructor */ @@ -185,13 +187,13 @@ std::shared_ptr Downloader::getDownload(const std::string& did) try { return m_knownDownloads.at(did); } catch(std::exception& e) { - for (auto gid : mp_aria->tellActive()) { + for (auto gid : mp_aria->tellWaiting()) { if (gid == did) { m_knownDownloads[gid] = std::make_shared(mp_aria, gid); return m_knownDownloads[gid]; } } - for (auto gid : mp_aria->tellWaiting()) { + for (auto gid : mp_aria->tellActive()) { if (gid == did) { m_knownDownloads[gid] = std::make_shared(mp_aria, gid); return m_knownDownloads[gid];