Forráskód Böngészése

Reuse in-flight and pooled URIs when a download is paused.

Tatsuhiro Tsujikawa 14 éve
szülő
commit
e2e711fba8
4 módosított fájl, 44 hozzáadás és 0 törlés
  1. 1 0
      src/DownloadContext.cc
  2. 19 0
      src/FileEntry.cc
  3. 3 0
      src/FileEntry.h
  4. 21 0
      test/FileEntryTest.cc

+ 1 - 0
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();
   }
 }

+ 19 - 0
src/FileEntry.cc

@@ -452,6 +452,25 @@ void FileEntry::releaseRuntimeResource()
   inFlightRequests_.clear();
 }
 
+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

+ 3 - 0
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

+ 21 - 0
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