summaryrefslogtreecommitdiff
path: root/src/BitfieldMan.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2015-02-14 18:33:37 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2015-02-14 18:33:37 +0900
commitc63fc414c389c893c80022669a7d75f3c6869c7e (patch)
tree4ce834b649ca85cc3527f6424feeeeac1b0bd19d /src/BitfieldMan.cc
parentba0e32abaecedf3939905bd316336f313b3dd745 (diff)
Add --stream-piece-selector=random
Diffstat (limited to 'src/BitfieldMan.cc')
-rw-r--r--src/BitfieldMan.cc40
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_);
}