diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-07-15 11:39:21 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-07-15 11:39:21 +0000 |
| commit | 1ddaaf7614a413947b59b9be4ee2c4c52d463e4a (patch) | |
| tree | 81103314dcf6cde0f205d11b76004a20ffa36d43 /src/BitfieldMan.cc | |
| parent | 55748de7268ac073a7e76d133996d229cf26b190 (diff) | |
2010-07-15 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added --min-split-size=SIZE option. aria2 does not split less
than 2*SIZE byte range. For example, let's consider downloading
20MiB file. If SIZE is 10M, aria2 can split file into 2 range
[0-10MiB) and [10MiB-20MiB) and download it using 2 sources(if
--split >= 2, of course). If SIZE is 15M, since 2*15M > 20MiB,
aria2 does not split file and download it using 1 source.
* src/BitfieldMan.cc
* src/BitfieldMan.h
* src/DefaultPieceStorage.cc
* src/DefaultPieceStorage.h
* src/OptionHandlerFactory.cc
* src/RequestGroup.cc
* src/prefs.cc
* src/prefs.h
* src/usage_text.h
* test/BitfieldManTest.cc
* test/SegmentManTest.cc
Diffstat (limited to 'src/BitfieldMan.cc')
| -rw-r--r-- | src/BitfieldMan.cc | 68 |
1 files changed, 47 insertions, 21 deletions
diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index 907a05ce..427e02de 100644 --- a/src/BitfieldMan.cc +++ b/src/BitfieldMan.cc @@ -221,37 +221,59 @@ static size_t getEndIndex(size_t index, const Array& bitfield, size_t blocks) { template<typename Array> static bool getSparseMissingUnusedIndex (size_t& index, + size_t minSplitSize, const Array& bitfield, const unsigned char* useBitfield, + size_t blockLength_, size_t blocks) { BitfieldMan::Range maxRange; BitfieldMan::Range currentRange; - { - size_t nextIndex = 0; - while(nextIndex < blocks) { - currentRange.startIndex = - getStartIndex(nextIndex, bitfield, blocks); - if(currentRange.startIndex == blocks) { - break; - } - currentRange.endIndex = - getEndIndex(currentRange.startIndex, bitfield, blocks); - if(maxRange < currentRange) { - maxRange = currentRange; + size_t nextIndex = 0; + while(nextIndex < blocks) { + currentRange.startIndex = + getStartIndex(nextIndex, bitfield, blocks); + if(currentRange.startIndex == blocks) { + break; + } + currentRange.endIndex = + getEndIndex(currentRange.startIndex, bitfield, blocks); + + if(currentRange.startIndex > 0) { + if(bitfield::test(useBitfield, blocks, currentRange.startIndex-1)) { + currentRange.startIndex = currentRange.getMidIndex(); } - nextIndex = currentRange.endIndex; } + // If range is equal, choose a range where its startIndex-1 is + // set. + if(maxRange < currentRange || + (maxRange == currentRange && + maxRange.startIndex > 0 && currentRange.startIndex > 0 && + (!bitfield::test(bitfield, blocks, maxRange.startIndex-1) || + bitfield::test(useBitfield, blocks, maxRange.startIndex-1)) + && + bitfield::test(bitfield, blocks, currentRange.startIndex-1) && + !bitfield::test(useBitfield, blocks, currentRange.startIndex-1))) { + maxRange = currentRange; + } + nextIndex = currentRange.endIndex; + } if(maxRange.getSize()) { if(maxRange.startIndex == 0) { index = 0; - } else if(bitfield::test(useBitfield, blocks, maxRange.startIndex-1)) { - index = maxRange.getMidIndex(); + return true; } else { - index = maxRange.startIndex; + if((!bitfield::test(useBitfield, blocks, maxRange.startIndex-1) && + bitfield::test(bitfield, blocks, maxRange.startIndex-1)) || + ((uint64_t)(maxRange.endIndex-maxRange.startIndex)*blockLength_ + >= minSplitSize)) { + index = maxRange.startIndex; + return true; + } else { + return false; + } } - return true; } else { return false; } @@ -259,17 +281,21 @@ static bool getSparseMissingUnusedIndex bool BitfieldMan::getSparseMissingUnusedIndex (size_t& index, + size_t minSplitSize, const unsigned char* ignoreBitfield, size_t ignoreBitfieldLength) const { if(filterEnabled_) { return aria2::getSparseMissingUnusedIndex - (index, array(ignoreBitfield)|~array(filterBitfield_)|array(bitfield_)|array(useBitfield_), - useBitfield_, blocks_); + (index, minSplitSize, + array(ignoreBitfield)|~array(filterBitfield_)| + array(bitfield_)|array(useBitfield_), + useBitfield_, blockLength_, blocks_); } else { return aria2::getSparseMissingUnusedIndex - (index, array(ignoreBitfield)|array(bitfield_)|array(useBitfield_), - useBitfield_, blocks_); + (index, minSplitSize, + array(ignoreBitfield)|array(bitfield_)|array(useBitfield_), + useBitfield_, blockLength_, blocks_); } } |
