/* */ #include "ActivePeerConnectionCommand.h" #include "PeerInitiateConnectionCommand.h" #include "CUIDCounter.h" #include "message.h" #include "DownloadEngine.h" #include "BtContext.h" #include "PeerStorage.h" #include "PieceStorage.h" #include "BtRuntime.h" #include "Peer.h" #include "Logger.h" #include "prefs.h" #include "Option.h" #include "BtConstants.h" #include "SocketCore.h" namespace aria2 { ActivePeerConnectionCommand::ActivePeerConnectionCommand(int cuid, RequestGroup* requestGroup, DownloadEngine* e, const BtContextHandle& btContext, time_t interval) :Command(cuid), BtContextAwareCommand(btContext), RequestGroupAware(requestGroup), interval(interval), e(e), _thresholdSpeed(SLOW_SPEED_THRESHOLD), _numNewConnection(5) { unsigned int maxDownloadSpeed = e->option->getAsInt(PREF_MAX_DOWNLOAD_LIMIT); if(maxDownloadSpeed > 0) { _thresholdSpeed = std::min(maxDownloadSpeed, _thresholdSpeed); } } ActivePeerConnectionCommand::~ActivePeerConnectionCommand() {} bool ActivePeerConnectionCommand::execute() { if(btRuntime->isHalt()) { return true; } if(!pieceStorage->downloadFinished() && checkPoint.elapsed(interval)) { checkPoint.reset(); TransferStat tstat = peerStorage->calculateStat(); size_t numAdd = btRuntime->lessThanEqMinPeer() ? MIN_PEERS-btRuntime->getConnections():_numNewConnection; if(tstat.getDownloadSpeed() < _thresholdSpeed || btRuntime->lessThanEqMinPeer()) { for(; numAdd > 0 && peerStorage->isPeerAvailable(); --numAdd) { PeerHandle peer = peerStorage->getUnusedPeer(); connectToPeer(peer); } } } e->commands.push_back(this); return false; } void ActivePeerConnectionCommand::connectToPeer(const PeerHandle& peer) { if(peer.isNull()) { return; } peer->usedBy(CUIDCounterSingletonHolder::instance()->newID()); PeerInitiateConnectionCommand* command = new PeerInitiateConnectionCommand(peer->usedBy(), _requestGroup, peer, e, btContext); e->commands.push_back(command); logger->info(MSG_CONNECTING_TO_PEER, cuid, peer->ipaddr.c_str()); } } // namespace aria2