summaryrefslogtreecommitdiff
path: root/src/BitfieldMan.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-07-15 11:39:21 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-07-15 11:39:21 +0000
commit1ddaaf7614a413947b59b9be4ee2c4c52d463e4a (patch)
tree81103314dcf6cde0f205d11b76004a20ffa36d43 /src/BitfieldMan.cc
parent55748de7268ac073a7e76d133996d229cf26b190 (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.cc68
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_);
}
}