Prechádzať zdrojové kódy

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
Tatsuhiro Tsujikawa 16 rokov pred
rodič
commit
a41b927a57
4 zmenil súbory, kde vykonal 66 pridanie a 42 odobranie
  1. 7 0
      ChangeLog
  2. 1 1
      src/usage_text.h
  3. 54 36
      src/util.cc
  4. 4 5
      test/UtilTest.cc

+ 7 - 0
ChangeLog

@@ -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>
 
 	Updated Russian, Ukrainian, German and French translations.

+ 1 - 1
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.")

+ 54 - 36
src/util.cc

@@ -525,60 +525,78 @@ IntSequence parseIntRange(const std::string& src)
   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
 (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") {
-      for(std::vector<SharedHandle<FileEntry> >::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<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);
-	}
-      }
+      computeHeadPieces(indexes, fileEntries, pieceLength,
+			std::max((int64_t)0, getRealSize(sizestr)));
     } else if((*i) == "tail") {
-      for(std::vector<SharedHandle<FileEntry> >::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<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);
-	}
-      }
+      computeTailPieces(indexes, fileEntries, pieceLength,
+			std::max((int64_t)0, getRealSize(sizestr)));
     } else {
       throw DL_ABORT_EX
 	(StringFormat("Unrecognized token %s", (*i).c_str()).str());

+ 4 - 5
test/UtilTest.cc

@@ -842,13 +842,13 @@ void UtilTest::testParsePrioritizePieceRange()
   entries[3].reset(new FileEntry("file4",3584,entries[2]->getLastOffset()));
 
   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)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]);