Ver Fonte

GeomStreamPieceSelector: Made base changeable and added offsetIndex
parameter.

Tatsuhiro Tsujikawa há 14 anos atrás
pai
commit
a081f651a1

+ 16 - 9
src/BitfieldMan.cc

@@ -317,15 +317,18 @@ bool getGeomMissingUnusedIndex
  const Array& bitfield,
  const unsigned char* useBitfield,
  size_t blockLength,
- size_t blocks)
+ size_t blocks,
+ double base,
+ size_t offsetIndex)
 {
-  const size_t base = 2;
-  size_t start = 0;
-  size_t end = 1;
-  while(start < blocks) {
+  double start = 0;
+  double end = 1;
+  while(start+offsetIndex < blocks) {
     index = blocks;
     bool ok = false;
-    for(size_t i = start, eoi = std::min(blocks, end); i < eoi; ++i) {
+    for(size_t i = start+offsetIndex,
+          eoi = std::min(blocks, static_cast<size_t>(end+offsetIndex));
+        i < eoi; ++i) {
       if(bitfield::test(useBitfield, blocks, i)) {
         ok = false;
         break;
@@ -351,19 +354,23 @@ bool BitfieldMan::getGeomMissingUnusedIndex
 (size_t& index,
  size_t minSplitSize,
  const unsigned char* ignoreBitfield,
- size_t ignoreBitfieldLength) const
+ size_t ignoreBitfieldLength,
+ double base,
+ size_t offsetIndex) const
 {
   if(filterEnabled_) {
     return aria2::getGeomMissingUnusedIndex
       (index, minSplitSize,
        array(ignoreBitfield)|~array(filterBitfield_)|
        array(bitfield_)|array(useBitfield_),
-       useBitfield_, blockLength_, blocks_);
+       useBitfield_, blockLength_, blocks_,
+       base, offsetIndex);
   } else {
     return aria2::getGeomMissingUnusedIndex
       (index, minSplitSize,
        array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
-       useBitfield_, blockLength_, blocks_);
+       useBitfield_, blockLength_, blocks_,
+       base, offsetIndex);
   }
 }
 

+ 3 - 1
src/BitfieldMan.h

@@ -139,7 +139,9 @@ public:
   (size_t& index,
    size_t minSplitSize,
    const unsigned char* ignoreBitfield,
-   size_t ignoreBitfieldLength) const;
+   size_t ignoreBitfieldLength,
+   double base,
+   size_t offsetIndex) const;
 
   // Stores missing bit index to index. This function selects smallest
   // index of missing piece, considering minSplitSize.  Set bits in

+ 1 - 1
src/DefaultPieceStorage.cc

@@ -88,7 +88,7 @@ DefaultPieceStorage::DefaultPieceStorage
   } else if(pieceSelectorOpt == V_INORDER) {
     streamPieceSelector_.reset(new InorderStreamPieceSelector(bitfieldMan_));
   } else if(pieceSelectorOpt == A2_V_GEOM) {
-    streamPieceSelector_.reset(new GeomStreamPieceSelector(bitfieldMan_));
+    streamPieceSelector_.reset(new GeomStreamPieceSelector(bitfieldMan_, 1.5));
   }
 }
 

+ 5 - 3
src/GeomStreamPieceSelector.cc

@@ -38,8 +38,10 @@
 namespace aria2 {
 
 GeomStreamPieceSelector::GeomStreamPieceSelector
-(BitfieldMan* bitfieldMan)
-  : bitfieldMan_(bitfieldMan)
+(BitfieldMan* bitfieldMan,
+ double base)
+  : bitfieldMan_(bitfieldMan),
+    base_(base)
 {}
 
 GeomStreamPieceSelector::~GeomStreamPieceSelector() {}
@@ -51,7 +53,7 @@ bool GeomStreamPieceSelector::select
  size_t length)
 {
   return bitfieldMan_->getGeomMissingUnusedIndex
-    (index, minSplitSize, ignoreBitfield, length);
+    (index, minSplitSize, ignoreBitfield, length, base_, 0);
 }
 
 } // namespace aria2

+ 2 - 1
src/GeomStreamPieceSelector.h

@@ -43,7 +43,7 @@ class BitfieldMan;
 
 class GeomStreamPieceSelector:public StreamPieceSelector {
 public:
-  GeomStreamPieceSelector(BitfieldMan* bitfieldMan);
+  GeomStreamPieceSelector(BitfieldMan* bitfieldMan, double base);
   virtual ~GeomStreamPieceSelector();
 
   virtual bool select
@@ -53,6 +53,7 @@ public:
    size_t length);
 private:
   BitfieldMan* bitfieldMan_;
+  double base_;
 };
 
 } // namespace aria2

+ 7 - 7
test/BitfieldManTest.cc

@@ -743,43 +743,43 @@ void BitfieldManTest::testGetGeomMissingUnusedIndex()
   // 00000|00000|00000|00000
   CPPUNIT_ASSERT
     (bt.getGeomMissingUnusedIndex
-     (index, minSplitSize, ignoreBitfield, length));
+     (index, minSplitSize, ignoreBitfield, length, 2, 0));
   CPPUNIT_ASSERT_EQUAL((size_t)0, index);
   bt.setUseBit(0);
   // 10000|00000|00000|00000
   CPPUNIT_ASSERT
     (bt.getGeomMissingUnusedIndex
-     (index, minSplitSize, ignoreBitfield, length));
+     (index, minSplitSize, ignoreBitfield, length, 2, 0));
   CPPUNIT_ASSERT_EQUAL((size_t)1, index);
   bt.setUseBit(1);
   // 11000|00000|00000|00000
   CPPUNIT_ASSERT
     (bt.getGeomMissingUnusedIndex
-     (index, minSplitSize, ignoreBitfield, length));
+     (index, minSplitSize, ignoreBitfield, length, 2, 0));
   CPPUNIT_ASSERT_EQUAL((size_t)2, index);
   bt.setUseBit(2);
   // 11100|00000|00000|00000
   CPPUNIT_ASSERT
     (bt.getGeomMissingUnusedIndex
-     (index, minSplitSize, ignoreBitfield, length));
+     (index, minSplitSize, ignoreBitfield, length, 2, 0));
   CPPUNIT_ASSERT_EQUAL((size_t)4, index);
   bt.setUseBit(4);
   // 11110|00000|00000|00000
   CPPUNIT_ASSERT
     (bt.getGeomMissingUnusedIndex
-     (index, minSplitSize, ignoreBitfield, length));
+     (index, minSplitSize, ignoreBitfield, length, 2, 0));
   CPPUNIT_ASSERT_EQUAL((size_t)8, index);
   bt.setUseBit(8);
   // 11110|00010|00000|00000
   CPPUNIT_ASSERT
     (bt.getGeomMissingUnusedIndex
-     (index, minSplitSize, ignoreBitfield, length));
+     (index, minSplitSize, ignoreBitfield, length, 2, 0));
   CPPUNIT_ASSERT_EQUAL((size_t)16, index);
   bt.setUseBit(16);
   // 11110|00010|00000|01000
   CPPUNIT_ASSERT
     (bt.getGeomMissingUnusedIndex
-     (index, minSplitSize, ignoreBitfield, length));
+     (index, minSplitSize, ignoreBitfield, length, 2, 0));
   CPPUNIT_ASSERT_EQUAL((size_t)12, index);
   bt.setUseBit(12);
 }