mirror of https://github.com/aria2/aria2
2009-12-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Set default value for SIZE in --bt-prioritize-piece to 1MiB. * src/usage_text.h * src/util.cc * test/UtilTest.ccpull/1/head
parent
5cc0d57e26
commit
a41b927a57
|
@ -1,3 +1,10 @@
|
||||||
|
2009-12-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
|
Set default value for SIZE in --bt-prioritize-piece to 1MiB.
|
||||||
|
* src/usage_text.h
|
||||||
|
* src/util.cc
|
||||||
|
* test/UtilTest.cc
|
||||||
|
|
||||||
2009-12-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
2009-12-06 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
|
||||||
|
|
||||||
Updated Russian, Ukrainian, German and French translations.
|
Updated Russian, Ukrainian, German and French translations.
|
||||||
|
|
|
@ -575,7 +575,7 @@ _(" --bt-prioritize-piece=head[=SIZE],tail[=SIZE] Try to download first and last
|
||||||
" first SIZE bytes of each file get higher priority.\n"\
|
" first SIZE bytes of each file get higher priority.\n"\
|
||||||
" tail=SIZE means the range of last SIZE bytes of\n"\
|
" tail=SIZE means the range of last SIZE bytes of\n"\
|
||||||
" each file. SIZE can include K or M(1K = 1024, 1M =\n"\
|
" each file. SIZE can include K or M(1K = 1024, 1M =\n"\
|
||||||
" 1024K).")
|
" 1024K). If SIZE is omitted, SIZE=1M is used.")
|
||||||
#define TEXT_INTERFACE \
|
#define TEXT_INTERFACE \
|
||||||
_(" --interface=INTERFACE Bind sockets to given interface. You can specify\n"\
|
_(" --interface=INTERFACE Bind sockets to given interface. You can specify\n"\
|
||||||
" interface name, IP address and hostname.")
|
" interface name, IP address and hostname.")
|
||||||
|
|
90
src/util.cc
90
src/util.cc
|
@ -525,60 +525,78 @@ IntSequence parseIntRange(const std::string& src)
|
||||||
return values;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void computeHeadPieces
|
||||||
|
(std::vector<size_t>& indexes,
|
||||||
|
const std::vector<SharedHandle<FileEntry> >& fileEntries,
|
||||||
|
size_t pieceLength,
|
||||||
|
uint64_t head)
|
||||||
|
{
|
||||||
|
if(head == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
|
||||||
|
fileEntries.begin(); fi != fileEntries.end(); ++fi) {
|
||||||
|
if((*fi)->getLength() == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
size_t lastIndex =
|
||||||
|
((*fi)->getOffset()+std::min(head, (*fi)->getLength())-1)/pieceLength;
|
||||||
|
for(size_t index = (*fi)->getOffset()/pieceLength;
|
||||||
|
index <= lastIndex; ++index) {
|
||||||
|
indexes.push_back(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void computeTailPieces
|
||||||
|
(std::vector<size_t>& indexes,
|
||||||
|
const std::vector<SharedHandle<FileEntry> >& fileEntries,
|
||||||
|
size_t pieceLength,
|
||||||
|
uint64_t tail)
|
||||||
|
{
|
||||||
|
if(tail == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
|
||||||
|
fileEntries.begin(); fi != fileEntries.end(); ++fi) {
|
||||||
|
if((*fi)->getLength() == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
uint64_t endOffset = (*fi)->getLastOffset();
|
||||||
|
size_t fromIndex =
|
||||||
|
(endOffset-1-(std::min(tail, (*fi)->getLength())-1))/pieceLength;
|
||||||
|
for(size_t index = fromIndex; index <= (endOffset-1)/pieceLength;
|
||||||
|
++index) {
|
||||||
|
indexes.push_back(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void parsePrioritizePieceRange
|
void parsePrioritizePieceRange
|
||||||
(std::vector<size_t>& result, const std::string& src,
|
(std::vector<size_t>& result, const std::string& src,
|
||||||
const std::vector<SharedHandle<FileEntry> >& fileEntries,
|
const std::vector<SharedHandle<FileEntry> >& fileEntries,
|
||||||
size_t pieceLength)
|
size_t pieceLength)
|
||||||
{
|
{
|
||||||
|
const uint64_t DEFAULT_SIZE = 1024*1024;
|
||||||
std::vector<size_t> indexes;
|
std::vector<size_t> indexes;
|
||||||
std::vector<std::string> parts;
|
std::vector<std::string> parts;
|
||||||
split(src, std::back_inserter(parts), ",", true);
|
split(src, std::back_inserter(parts), ",", true);
|
||||||
for(std::vector<std::string>::const_iterator i = parts.begin();
|
for(std::vector<std::string>::const_iterator i = parts.begin();
|
||||||
i != parts.end(); ++i) {
|
i != parts.end(); ++i) {
|
||||||
if((*i) == "head") {
|
if((*i) == "head") {
|
||||||
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
|
computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE);
|
||||||
fileEntries.begin(); fi != fileEntries.end(); ++fi) {
|
|
||||||
indexes.push_back((*fi)->getOffset()/pieceLength);
|
|
||||||
}
|
|
||||||
} else if(util::startsWith(*i, "head=")) {
|
} else if(util::startsWith(*i, "head=")) {
|
||||||
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
|
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
|
||||||
(*i).end());
|
(*i).end());
|
||||||
uint64_t head = std::max((int64_t)0, getRealSize(sizestr));
|
computeHeadPieces(indexes, fileEntries, pieceLength,
|
||||||
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
|
std::max((int64_t)0, getRealSize(sizestr)));
|
||||||
fileEntries.begin(); fi != fileEntries.end(); ++fi) {
|
|
||||||
if((*fi)->getLength() == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
size_t lastIndex =
|
|
||||||
((*fi)->getOffset()+std::min(head, (*fi)->getLength())-1)/pieceLength;
|
|
||||||
for(size_t index = (*fi)->getOffset()/pieceLength;
|
|
||||||
index <= lastIndex; ++index) {
|
|
||||||
indexes.push_back(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if((*i) == "tail") {
|
} else if((*i) == "tail") {
|
||||||
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
|
computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE);
|
||||||
fileEntries.begin(); fi != fileEntries.end(); ++fi) {
|
|
||||||
indexes.push_back
|
|
||||||
(((*fi)->getOffset()+(*fi)->getLength()-1)/pieceLength);
|
|
||||||
}
|
|
||||||
} else if(util::startsWith(*i, "tail=")) {
|
} else if(util::startsWith(*i, "tail=")) {
|
||||||
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
|
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
|
||||||
(*i).end());
|
(*i).end());
|
||||||
uint64_t tail = std::max((int64_t)0, getRealSize(sizestr));
|
computeTailPieces(indexes, fileEntries, pieceLength,
|
||||||
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
|
std::max((int64_t)0, getRealSize(sizestr)));
|
||||||
fileEntries.begin(); fi != fileEntries.end(); ++fi) {
|
|
||||||
if((*fi)->getLength() == 0) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
uint64_t endOffset = (*fi)->getLastOffset();
|
|
||||||
size_t fromIndex =
|
|
||||||
(endOffset-1-(std::min(tail, (*fi)->getLength())-1))/pieceLength;
|
|
||||||
for(size_t index = fromIndex; index <= (endOffset-1)/pieceLength;
|
|
||||||
++index) {
|
|
||||||
indexes.push_back(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
throw DL_ABORT_EX
|
throw DL_ABORT_EX
|
||||||
(StringFormat("Unrecognized token %s", (*i).c_str()).str());
|
(StringFormat("Unrecognized token %s", (*i).c_str()).str());
|
||||||
|
|
|
@ -842,13 +842,13 @@ void UtilTest::testParsePrioritizePieceRange()
|
||||||
entries[3].reset(new FileEntry("file4",3584,entries[2]->getLastOffset()));
|
entries[3].reset(new FileEntry("file4",3584,entries[2]->getLastOffset()));
|
||||||
|
|
||||||
std::vector<size_t> result;
|
std::vector<size_t> result;
|
||||||
util::parsePrioritizePieceRange(result, "head", entries, pieceLength);
|
util::parsePrioritizePieceRange(result, "head=1", entries, pieceLength);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
|
CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
|
CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
|
CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
|
||||||
result.clear();
|
result.clear();
|
||||||
util::parsePrioritizePieceRange(result, "tail", entries, pieceLength);
|
util::parsePrioritizePieceRange(result, "tail=1", entries, pieceLength);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)3, result.size());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
|
CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, result[1]);
|
CPPUNIT_ASSERT_EQUAL((size_t)3, result[1]);
|
||||||
|
@ -868,15 +868,14 @@ void UtilTest::testParsePrioritizePieceRange()
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
|
CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
|
CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
|
||||||
result.clear();
|
result.clear();
|
||||||
util::parsePrioritizePieceRange(result, "head,tail", entries, pieceLength);
|
util::parsePrioritizePieceRange(result, "head=1,tail=1", entries, pieceLength);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)4, result.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)4, result.size());
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
|
CPPUNIT_ASSERT_EQUAL((size_t)0, result[0]);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
|
CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
|
CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]);
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
|
CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]);
|
||||||
result.clear();
|
result.clear();
|
||||||
util::parsePrioritizePieceRange
|
util::parsePrioritizePieceRange(result, "head,tail", entries, pieceLength);
|
||||||
(result, "head=300M,tail=300M", entries, pieceLength);
|
|
||||||
CPPUNIT_ASSERT_EQUAL((size_t)7, result.size());
|
CPPUNIT_ASSERT_EQUAL((size_t)7, result.size());
|
||||||
for(size_t i = 0; i < 7; ++i) {
|
for(size_t i = 0; i < 7; ++i) {
|
||||||
CPPUNIT_ASSERT_EQUAL(i, result[i]);
|
CPPUNIT_ASSERT_EQUAL(i, result[i]);
|
||||||
|
|
Loading…
Reference in New Issue