GeomStreamPieceSelector: Made base changeable and added offsetIndex

parameter.
pull/2/head
Tatsuhiro Tsujikawa 2011-08-23 23:19:10 +09:00
parent 7318c361bc
commit a081f651a1
6 changed files with 34 additions and 22 deletions

View File

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

View File

@ -139,7 +139,9 @@ public:
(size_t& index, (size_t& index,
size_t minSplitSize, size_t minSplitSize,
const unsigned char* ignoreBitfield, 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 // Stores missing bit index to index. This function selects smallest
// index of missing piece, considering minSplitSize. Set bits in // index of missing piece, considering minSplitSize. Set bits in

View File

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

View File

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

View File

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

View File

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