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

pull/2/head
Tatsuhiro Tsujikawa 2011-10-31 21:53:24 +09:00
parent 4532881eb6
commit e2e711fba8
4 changed files with 44 additions and 0 deletions

View File

@ -185,6 +185,7 @@ void DownloadContext::releaseRuntimeResource()
{ {
for(std::vector<SharedHandle<FileEntry> >::const_iterator i = for(std::vector<SharedHandle<FileEntry> >::const_iterator i =
fileEntries_.begin(), eoi = fileEntries_.end(); i != eoi; ++i) { fileEntries_.begin(), eoi = fileEntries_.end(); i != eoi; ++i) {
(*i)->putBackRequest();
(*i)->releaseRuntimeResource(); (*i)->releaseRuntimeResource();
} }
} }

View File

@ -452,6 +452,25 @@ void FileEntry::releaseRuntimeResource()
inFlightRequests_.clear(); 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 { namespace {
template<typename InputIterator, typename T> template<typename InputIterator, typename T>
InputIterator findRequestByUri InputIterator findRequestByUri

View File

@ -231,6 +231,9 @@ public:
void releaseRuntimeResource(); void releaseRuntimeResource();
// Push URIs in pooled or in-flight requests to the front of uris_.
void putBackRequest();
void setOriginalName(const std::string& originalName); void setOriginalName(const std::string& originalName);
const std::string& getOriginalName() const const std::string& getOriginalName() const

View File

@ -20,6 +20,7 @@ class FileEntryTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testAddUris); CPPUNIT_TEST(testAddUris);
CPPUNIT_TEST(testInsertUri); CPPUNIT_TEST(testInsertUri);
CPPUNIT_TEST(testRemoveUri); CPPUNIT_TEST(testRemoveUri);
CPPUNIT_TEST(testPutBackRequest);
CPPUNIT_TEST_SUITE_END(); CPPUNIT_TEST_SUITE_END();
public: public:
void setUp() {} void setUp() {}
@ -34,6 +35,7 @@ public:
void testAddUris(); void testAddUris();
void testInsertUri(); void testInsertUri();
void testRemoveUri(); void testRemoveUri();
void testPutBackRequest();
}; };
@ -292,4 +294,23 @@ void FileEntryTest::testRemoveUri()
CPPUNIT_ASSERT(!file.removeUri("http://example.net")); 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 } // namespace aria2