mirror of https://github.com/aria2/aria2
Reuse in-flight and pooled URIs when a download is paused.
parent
4532881eb6
commit
e2e711fba8
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue