summaryrefslogtreecommitdiff
path: root/src/DefaultBtRequestFactory.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-10 15:07:06 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-10 15:07:06 +0000
commitccc552cec90b9e71ca36db763fe2ea95bb2dd2ca (patch)
treed1ed3197a5f21abc6eaa644d6dc0ffcef2faf5dd /src/DefaultBtRequestFactory.cc
parent762580ba8cbcb14734d42b9e8f6a1c16220319f2 (diff)
2010-02-11 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
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
Diffstat (limited to 'src/DefaultBtRequestFactory.cc')
-rw-r--r--src/DefaultBtRequestFactory.cc34
1 files changed, 22 insertions, 12 deletions
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<SharedHandle<BtMessage> >& requests, size_t max)
{
+ if(requests.size() >= max) {
+ return;
+ }
+ size_t getnum = max-requests.size();
+ std::vector<size_t> 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>& piece = *itr;
+ if(piece->getMissingUnusedBlockIndex(blockIndexes, getnum)) {
+ getnum -= blockIndexes.size();
+ for(std::vector<size_t>::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();
}
}
}