summaryrefslogtreecommitdiff
path: root/src/DefaultBtInteractive.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-29 08:53:19 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-08-29 08:53:19 +0000
commite997903e5d29adb83d8dfa435ff05f3cc87d4ee7 (patch)
treeb3930396f8437b13519e924790bcbe599578b34f /src/DefaultBtInteractive.cc
parentb49081340dec7bd5b3370214b3dde0d570a52d10 (diff)
2010-08-29 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added a sets of overloaded functions for PieceStorage::getMissingPiece() and getMissingFastPiece() to get multiple pieces more efficiently. * src/DefaultBtInteractive.cc * src/DefaultPieceStorage.cc * src/DefaultPieceStorage.h * src/PieceStorage.h * src/UnknownLengthPieceStorage.cc * src/UnknownLengthPieceStorage.h * test/DefaultPieceStorageTest.cc * test/MockPieceStorage.h
Diffstat (limited to 'src/DefaultBtInteractive.cc')
-rw-r--r--src/DefaultBtInteractive.cc55
1 files changed, 27 insertions, 28 deletions
diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc
index a9ed1dbf..a871b532 100644
--- a/src/DefaultBtInteractive.cc
+++ b/src/DefaultBtInteractive.cc
@@ -355,42 +355,41 @@ void DefaultBtInteractive::decideInterest() {
void DefaultBtInteractive::fillPiece(size_t maxMissingBlock) {
if(pieceStorage_->hasMissingPiece(peer_)) {
-
size_t numMissingBlock = btRequestFactory_->countMissingBlock();
-
+ if(numMissingBlock >= maxMissingBlock) {
+ return;
+ }
+ size_t diffMissingBlock = maxMissingBlock-numMissingBlock;
+ std::vector<SharedHandle<Piece> > pieces;
if(peer_->peerChoking()) {
if(peer_->isFastExtensionEnabled()) {
- std::vector<size_t> excludedIndexes;
- excludedIndexes.reserve(btRequestFactory_->countTargetPiece());
- btRequestFactory_->getTargetPieceIndexes(excludedIndexes);
- while(numMissingBlock < maxMissingBlock) {
- SharedHandle<Piece> piece =
- pieceStorage_->getMissingFastPiece(peer_, excludedIndexes);
- if(piece.isNull()) {
- break;
- } else {
- btRequestFactory_->addTargetPiece(piece);
- numMissingBlock += piece->countMissingBlock();
- excludedIndexes.push_back(piece->getIndex());
- }
+ if(pieceStorage_->isEndGame()) {
+ std::vector<size_t> excludedIndexes;
+ excludedIndexes.reserve(btRequestFactory_->countTargetPiece());
+ btRequestFactory_->getTargetPieceIndexes(excludedIndexes);
+ pieceStorage_->getMissingFastPiece
+ (pieces, diffMissingBlock, peer_, excludedIndexes);
+ } else {
+ pieces.reserve(diffMissingBlock);
+ pieceStorage_->getMissingFastPiece(pieces, diffMissingBlock, peer_);
}
}
} else {
- std::vector<size_t> excludedIndexes;
- excludedIndexes.reserve(btRequestFactory_->countTargetPiece());
- btRequestFactory_->getTargetPieceIndexes(excludedIndexes);
- while(numMissingBlock < maxMissingBlock) {
- SharedHandle<Piece> piece =
- pieceStorage_->getMissingPiece(peer_, excludedIndexes);
- if(piece.isNull()) {
- break;
- } else {
- btRequestFactory_->addTargetPiece(piece);
- numMissingBlock += piece->countMissingBlock();
- excludedIndexes.push_back(piece->getIndex());
- }
+ if(pieceStorage_->isEndGame()) {
+ std::vector<size_t> excludedIndexes;
+ excludedIndexes.reserve(btRequestFactory_->countTargetPiece());
+ btRequestFactory_->getTargetPieceIndexes(excludedIndexes);
+ pieceStorage_->getMissingPiece
+ (pieces, diffMissingBlock, peer_, excludedIndexes);
+ } else {
+ pieces.reserve(diffMissingBlock);
+ pieceStorage_->getMissingPiece(pieces, diffMissingBlock, peer_);
}
}
+ for(std::vector<SharedHandle<Piece> >::const_iterator i =
+ pieces.begin(), eoi = pieces.end(); i != eoi; ++i) {
+ btRequestFactory_->addTargetPiece(*i);
+ }
}
}