summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-10-31 21:53:24 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-10-31 21:53:24 +0900
commite2e711fba8b888ba3ce8b9e89c10399dba6d134b (patch)
tree7c1986483ffee116eb58df2634d0b114152845d2
parent4532881eb6e910171c8b8d67ff81884913135b93 (diff)
Reuse in-flight and pooled URIs when a download is paused.
-rw-r--r--src/DownloadContext.cc1
-rw-r--r--src/FileEntry.cc19
-rw-r--r--src/FileEntry.h3
-rw-r--r--test/FileEntryTest.cc21
4 files changed, 44 insertions, 0 deletions
diff --git a/src/DownloadContext.cc b/src/DownloadContext.cc
index 3a47ed53..7f90627c 100644
--- a/src/DownloadContext.cc
+++ b/src/DownloadContext.cc
@@ -185,6 +185,7 @@ void DownloadContext::releaseRuntimeResource()
{
for(std::vector<SharedHandle<FileEntry> >::const_iterator i =
fileEntries_.begin(), eoi = fileEntries_.end(); i != eoi; ++i) {
+ (*i)->putBackRequest();
(*i)->releaseRuntimeResource();
}
}
diff --git a/src/FileEntry.cc b/src/FileEntry.cc
index 7d04e2dd..23721e7a 100644
--- a/src/FileEntry.cc
+++ b/src/FileEntry.cc
@@ -453,6 +453,25 @@ void FileEntry::releaseRuntimeResource()
}
namespace {
+template<typename InputIterator>
+void putBackUri
+(std::deque<std::string>& uris,
+ InputIterator first,
+ InputIterator last)
+{
+ for(; first != last; ++first) {
+ uris.push_front((*first)->getUri());
+ }
+}
+} // namespace
+
+void FileEntry::putBackRequest()
+{
+ putBackUri(uris_, requestPool_.begin(), requestPool_.end());
+ putBackUri(uris_, inFlightRequests_.begin(), inFlightRequests_.end());
+}
+
+namespace {
template<typename InputIterator, typename T>
InputIterator findRequestByUri
(InputIterator first, InputIterator last, const T& uri)
diff --git a/src/FileEntry.h b/src/FileEntry.h
index 029bd3e1..c77ca47a 100644
--- a/src/FileEntry.h
+++ b/src/FileEntry.h
@@ -231,6 +231,9 @@ public:
void releaseRuntimeResource();
+ // Push URIs in pooled or in-flight requests to the front of uris_.
+ void putBackRequest();
+
void setOriginalName(const std::string& originalName);
const std::string& getOriginalName() const
diff --git a/test/FileEntryTest.cc b/test/FileEntryTest.cc
index bcfe819d..3510409d 100644
--- a/test/FileEntryTest.cc
+++ b/test/FileEntryTest.cc
@@ -20,6 +20,7 @@ class FileEntryTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testAddUris);
CPPUNIT_TEST(testInsertUri);
CPPUNIT_TEST(testRemoveUri);
+ CPPUNIT_TEST(testPutBackRequest);
CPPUNIT_TEST_SUITE_END();
public:
void setUp() {}
@@ -34,6 +35,7 @@ public:
void testAddUris();
void testInsertUri();
void testRemoveUri();
+ void testPutBackRequest();
};
@@ -292,4 +294,23 @@ void FileEntryTest::testRemoveUri()
CPPUNIT_ASSERT(!file.removeUri("http://example.net"));
}
+void FileEntryTest::testPutBackRequest()
+{
+ SharedHandle<FileEntry> fileEntry = createFileEntry();
+ SharedHandle<InorderURISelector> selector(new InorderURISelector());
+ std::vector<std::pair<size_t, std::string> > usedHosts;
+ SharedHandle<Request> req1 =
+ fileEntry->getRequest(selector, false, usedHosts);
+ SharedHandle<Request> req2 =
+ fileEntry->getRequest(selector, false, usedHosts);
+ CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry->getRemainingUris().size());
+ fileEntry->poolRequest(req2);
+ fileEntry->putBackRequest();
+ const std::deque<std::string>& uris = fileEntry->getRemainingUris();
+ CPPUNIT_ASSERT_EQUAL((size_t)3, uris.size());
+ CPPUNIT_ASSERT_EQUAL(std::string("http://localhost/aria2.zip"), uris[0]);
+ CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.zip"), uris[1]);
+ CPPUNIT_ASSERT_EQUAL(std::string("ftp://localhost/aria2.zip"), uris[2]);
+}
+
} // namespace aria2