diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index 79d86d19..247f286d 100644 --- a/src/BitfieldMan.cc +++ b/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(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); } } diff --git a/src/BitfieldMan.h b/src/BitfieldMan.h index 98adc75e..98d15d1c 100644 --- a/src/BitfieldMan.h +++ b/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 diff --git a/src/DefaultPieceStorage.cc b/src/DefaultPieceStorage.cc index 659697db..47a43480 100644 --- a/src/DefaultPieceStorage.cc +++ b/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)); } } diff --git a/src/GeomStreamPieceSelector.cc b/src/GeomStreamPieceSelector.cc index bbe7dfd1..be1cd59c 100644 --- a/src/GeomStreamPieceSelector.cc +++ b/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 diff --git a/src/GeomStreamPieceSelector.h b/src/GeomStreamPieceSelector.h index 98ec0107..760b0801 100644 --- a/src/GeomStreamPieceSelector.h +++ b/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 diff --git a/test/BitfieldManTest.cc b/test/BitfieldManTest.cc index 9f3f9a17..1bd88eef 100644 --- a/test/BitfieldManTest.cc +++ b/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); }