diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2015-02-14 18:33:37 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2015-02-14 18:33:37 +0900 |
| commit | c63fc414c389c893c80022669a7d75f3c6869c7e (patch) | |
| tree | 4ce834b649ca85cc3527f6424feeeeac1b0bd19d /src/BitfieldMan.cc | |
| parent | ba0e32abaecedf3939905bd316336f313b3dd745 (diff) | |
Add --stream-piece-selector=random
Diffstat (limited to 'src/BitfieldMan.cc')
| -rw-r--r-- | src/BitfieldMan.cc | 40 |
1 files changed, 33 insertions, 7 deletions
diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index c1904205..4432253d 100644 --- a/src/BitfieldMan.cc +++ b/src/BitfieldMan.cc @@ -376,6 +376,8 @@ namespace { template<typename Array> bool getInorderMissingUnusedIndex (size_t& index, + size_t startIndex, + size_t lastIndex, int32_t minSplitSize, const Array& bitfield, const unsigned char* useBitfield, @@ -383,12 +385,12 @@ bool getInorderMissingUnusedIndex size_t blocks) { // We always return first piece if it is available. - if(!bitfield::test(bitfield, blocks, 0) && - !bitfield::test(useBitfield, blocks, 0)) { - index = 0; + if(!bitfield::test(bitfield, blocks, startIndex) && + !bitfield::test(useBitfield, blocks, startIndex)) { + index = startIndex; return true; } - for(size_t i = 1; i < blocks;) { + for(size_t i = startIndex + 1; i < lastIndex;) { if(!bitfield::test(bitfield, blocks, i) && !bitfield::test(useBitfield, blocks, i)) { // If previous piece has already been retrieved, we can download @@ -398,7 +400,8 @@ bool getInorderMissingUnusedIndex index = i; return true; } - // Check free space of minSplitSize. + // Check free space of minSplitSize. When checking this, we use + // blocks instead of lastIndex. size_t j; for(j = i; j < blocks; ++j) { if(bitfield::test(bitfield, blocks, j) || @@ -427,13 +430,36 @@ bool BitfieldMan::getInorderMissingUnusedIndex { if(filterEnabled_) { return aria2::getInorderMissingUnusedIndex - (index, minSplitSize, + (index, 0, blocks_, minSplitSize, array(ignoreBitfield)|~array(filterBitfield_)| array(bitfield_)|array(useBitfield_), useBitfield_, blockLength_, blocks_); } else { return aria2::getInorderMissingUnusedIndex - (index, minSplitSize, + (index, 0, blocks_, minSplitSize, + array(ignoreBitfield)|array(bitfield_)|array(useBitfield_), + useBitfield_, blockLength_, blocks_); + } +} + +bool BitfieldMan::getInorderMissingUnusedIndex +(size_t& index, + size_t startIndex, + size_t endIndex, + int32_t minSplitSize, + const unsigned char* ignoreBitfield, + size_t ignoreBitfieldLength) const +{ + endIndex = std::min(endIndex, blocks_); + if(filterEnabled_) { + return aria2::getInorderMissingUnusedIndex + (index, startIndex, endIndex, minSplitSize, + array(ignoreBitfield)|~array(filterBitfield_)| + array(bitfield_)|array(useBitfield_), + useBitfield_, blockLength_, blocks_); + } else { + return aria2::getInorderMissingUnusedIndex + (index, startIndex, endIndex, minSplitSize, array(ignoreBitfield)|array(bitfield_)|array(useBitfield_), useBitfield_, blockLength_, blocks_); } |
