diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-29 08:53:19 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2010-08-29 08:53:19 +0000 |
| commit | e997903e5d29adb83d8dfa435ff05f3cc87d4ee7 (patch) | |
| tree | b3930396f8437b13519e924790bcbe599578b34f /src/DefaultBtInteractive.cc | |
| parent | b49081340dec7bd5b3370214b3dde0d570a52d10 (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.cc | 55 |
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); + } } } |
