diff --git a/ChangeLog b/ChangeLog index ca67d7fb..de4e6252 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-12-06 Tatsuhiro Tsujikawa + + 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 Updated Russian, Ukrainian, German and French translations. diff --git a/src/usage_text.h b/src/usage_text.h index 32770047..8d4023a7 100644 --- a/src/usage_text.h +++ b/src/usage_text.h @@ -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"\ " tail=SIZE means the range of last SIZE bytes of\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 \ _(" --interface=INTERFACE Bind sockets to given interface. You can specify\n"\ " interface name, IP address and hostname.") diff --git a/src/util.cc b/src/util.cc index 18743c48..e889e238 100644 --- a/src/util.cc +++ b/src/util.cc @@ -525,60 +525,78 @@ IntSequence parseIntRange(const std::string& src) return values; } +static void computeHeadPieces +(std::vector& indexes, + const std::vector >& fileEntries, + size_t pieceLength, + uint64_t head) +{ + if(head == 0) { + return; + } + for(std::vector >::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& indexes, + const std::vector >& fileEntries, + size_t pieceLength, + uint64_t tail) +{ + if(tail == 0) { + return; + } + for(std::vector >::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 (std::vector& result, const std::string& src, const std::vector >& fileEntries, size_t pieceLength) { + const uint64_t DEFAULT_SIZE = 1024*1024; std::vector indexes; std::vector parts; split(src, std::back_inserter(parts), ",", true); for(std::vector::const_iterator i = parts.begin(); i != parts.end(); ++i) { if((*i) == "head") { - for(std::vector >::const_iterator fi = - fileEntries.begin(); fi != fileEntries.end(); ++fi) { - indexes.push_back((*fi)->getOffset()/pieceLength); - } + computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE); } 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 >::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); - } - } + computeHeadPieces(indexes, fileEntries, pieceLength, + std::max((int64_t)0, getRealSize(sizestr))); } else if((*i) == "tail") { - for(std::vector >::const_iterator fi = - fileEntries.begin(); fi != fileEntries.end(); ++fi) { - indexes.push_back - (((*fi)->getOffset()+(*fi)->getLength()-1)/pieceLength); - } + computeHeadPieces(indexes, fileEntries, pieceLength, DEFAULT_SIZE); } 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 >::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); - } - } + computeTailPieces(indexes, fileEntries, pieceLength, + std::max((int64_t)0, getRealSize(sizestr))); } else { throw DL_ABORT_EX (StringFormat("Unrecognized token %s", (*i).c_str()).str()); diff --git a/test/UtilTest.cc b/test/UtilTest.cc index 7845acf0..4653eb8f 100644 --- a/test/UtilTest.cc +++ b/test/UtilTest.cc @@ -842,13 +842,13 @@ void UtilTest::testParsePrioritizePieceRange() entries[3].reset(new FileEntry("file4",3584,entries[2]->getLastOffset())); std::vector 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)0, result[0]); CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]); CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]); 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)0, result[0]); 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)6, result[3]); 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)0, result[0]); CPPUNIT_ASSERT_EQUAL((size_t)1, result[1]); CPPUNIT_ASSERT_EQUAL((size_t)3, result[2]); CPPUNIT_ASSERT_EQUAL((size_t)6, result[3]); result.clear(); - util::parsePrioritizePieceRange - (result, "head=300M,tail=300M", entries, pieceLength); + util::parsePrioritizePieceRange(result, "head,tail", entries, pieceLength); CPPUNIT_ASSERT_EQUAL((size_t)7, result.size()); for(size_t i = 0; i < 7; ++i) { CPPUNIT_ASSERT_EQUAL(i, result[i]);