From ccc552cec90b9e71ca36db763fe2ea95bb2dd2ca Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Wed, 10 Feb 2010 15:07:06 +0000 Subject: 2010-02-11 Tatsuhiro Tsujikawa Added BitfieldMan::getFirstNMissingUnusedIndex() to get multiple unused block indexes at once instead of calling getFirstMissingUnusedIndex() multiple times. Made use of it in Piece class and DefaultBtRequestFactory class via Piece class. * src/BitfieldMan.cc * src/BitfieldMan.h * src/DefaultBtRequestFactory.cc * src/Piece.cc * src/Piece.h * test/BitfieldManTest.cc --- src/DefaultBtRequestFactory.cc | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'src/DefaultBtRequestFactory.cc') diff --git a/src/DefaultBtRequestFactory.cc b/src/DefaultBtRequestFactory.cc index c7ab09ed..3e55ddb2 100644 --- a/src/DefaultBtRequestFactory.cc +++ b/src/DefaultBtRequestFactory.cc @@ -152,20 +152,30 @@ void DefaultBtRequestFactory::removeAllTargetPiece() { void DefaultBtRequestFactory::createRequestMessages (std::deque >& requests, size_t max) { + if(requests.size() >= max) { + return; + } + size_t getnum = max-requests.size(); + std::vector blockIndexes; + blockIndexes.reserve(getnum); for(Pieces::iterator itr = pieces.begin(); - itr != pieces.end() && requests.size() < max; ++itr) { - PieceHandle& piece = *itr; - size_t blockIndex; - while(requests.size() < max && - piece->getMissingUnusedBlockIndex(blockIndex)) { - if(_logger->debug()) { - _logger->debug("Creating RequestMessage index=%u, begin=%u," - " blockIndex=%u", - piece->getIndex(), - blockIndex*piece->getBlockLength(), - blockIndex); + itr != pieces.end() && getnum; ++itr) { + SharedHandle& piece = *itr; + if(piece->getMissingUnusedBlockIndex(blockIndexes, getnum)) { + getnum -= blockIndexes.size(); + for(std::vector::const_iterator i = blockIndexes.begin(); + i != blockIndexes.end(); ++i) { + if(_logger->debug()) { + _logger->debug("Creating RequestMessage index=%u, begin=%u," + " blockIndex=%u", + piece->getIndex(), + (*i)*piece->getBlockLength(), + (*i)); + } + requests.push_back + (messageFactory->createRequestMessage(piece, *i)); } - requests.push_back(messageFactory->createRequestMessage(piece, blockIndex)); + blockIndexes.clear(); } } } -- cgit