|
@@ -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_);
|
|
|
}
|