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
pull/1/head
Tatsuhiro Tsujikawa 2009-12-06 11:35:45 +00:00
parent 5cc0d57e26
commit a41b927a57
4 changed files with 66 additions and 42 deletions

View File

@ -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.

View File

@ -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.")

View File

@ -525,25 +525,15 @@ IntSequence parseIntRange(const std::string& src)
return values; return values;
} }
void parsePrioritizePieceRange static void computeHeadPieces
(std::vector<size_t>& result, const std::string& src, (std::vector<size_t>& indexes,
const std::vector<SharedHandle<FileEntry> >& fileEntries, const std::vector<SharedHandle<FileEntry> >& fileEntries,
size_t pieceLength) size_t pieceLength,
uint64_t head)
{ {
std::vector<size_t> indexes; if(head == 0) {
std::vector<std::string> parts; return;
split(src, std::back_inserter(parts), ",", true);
for(std::vector<std::string>::const_iterator i = parts.begin();
i != parts.end(); ++i) {
if((*i) == "head") {
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
fileEntries.begin(); fi != fileEntries.end(); ++fi) {
indexes.push_back((*fi)->getOffset()/pieceLength);
} }
} else if(util::startsWith(*i, "head=")) {
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
(*i).end());
uint64_t head = std::max((int64_t)0, getRealSize(sizestr));
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi = for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
fileEntries.begin(); fi != fileEntries.end(); ++fi) { fileEntries.begin(); fi != fileEntries.end(); ++fi) {
if((*fi)->getLength() == 0) { if((*fi)->getLength() == 0) {
@ -556,16 +546,17 @@ void parsePrioritizePieceRange
indexes.push_back(index); indexes.push_back(index);
} }
} }
} else if((*i) == "tail") { }
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
fileEntries.begin(); fi != fileEntries.end(); ++fi) { static void computeTailPieces
indexes.push_back (std::vector<size_t>& indexes,
(((*fi)->getOffset()+(*fi)->getLength()-1)/pieceLength); const std::vector<SharedHandle<FileEntry> >& fileEntries,
size_t pieceLength,
uint64_t tail)
{
if(tail == 0) {
return;
} }
} else if(util::startsWith(*i, "tail=")) {
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
(*i).end());
uint64_t tail = std::max((int64_t)0, getRealSize(sizestr));
for(std::vector<SharedHandle<FileEntry> >::const_iterator fi = for(std::vector<SharedHandle<FileEntry> >::const_iterator fi =
fileEntries.begin(); fi != fileEntries.end(); ++fi) { fileEntries.begin(); fi != fileEntries.end(); ++fi) {
if((*fi)->getLength() == 0) { if((*fi)->getLength() == 0) {
@ -579,6 +570,33 @@ void parsePrioritizePieceRange
indexes.push_back(index); indexes.push_back(index);
} }
} }
}
void parsePrioritizePieceRange
(std::vector<size_t>& result, const std::string& src,
const std::vector<SharedHandle<FileEntry> >& fileEntries,
size_t pieceLength)
{
const uint64_t DEFAULT_SIZE = 1024*1024;
std::vector<size_t> indexes;
std::vector<std::string> parts;
split(src, std::back_inserter(parts), ",", true);
for(std::vector<std::string>::const_iterator i = parts.begin();
i != parts.end(); ++i) {
if((*i) == "head") {
computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE);
} else if(util::startsWith(*i, "head=")) {
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
(*i).end());
computeHeadPieces(indexes, fileEntries, pieceLength,
std::max((int64_t)0, getRealSize(sizestr)));
} else if((*i) == "tail") {
computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE);
} else if(util::startsWith(*i, "tail=")) {
std::string sizestr = std::string((*i).begin()+(*i).find("=")+1,
(*i).end());
computeTailPieces(indexes, fileEntries, pieceLength,
std::max((int64_t)0, getRealSize(sizestr)));
} 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());

View File

@ -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]);