diff --git a/ChangeLog b/ChangeLog index 23236260..aab7a088 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-06-04 Tatsuhiro Tsujikawa + + Accept incoming connections if download rate is low. + * src/PeerListenCommand.h, src/PeerListenCommand.cc: + (_lowestSpeedLimit): New variable. + (setLowestSpeedLimit): New function. + (execute): Accept incoming connections if download rate is low. + MAX_PEERS is ignored in this case. + 2007-06-03 Tatsuhiro Tsujikawa RequestGroup::getNextCommand() was renamed to createNextCommand(). diff --git a/TODO b/TODO index f89dda27..1776841d 100644 --- a/TODO +++ b/TODO @@ -34,3 +34,4 @@ * Do not use ufilename in multi-simultaneous download mode. * Create download command directly when 1connection download. Consider timeout when file allocation/check integrity is enabled. +* Accept incoming connections if download rate is low. diff --git a/src/PeerListenCommand.cc b/src/PeerListenCommand.cc index f544e9f3..74581569 100644 --- a/src/PeerListenCommand.cc +++ b/src/PeerListenCommand.cc @@ -41,7 +41,8 @@ PeerListenCommand::PeerListenCommand(int cuid, TorrentDownloadEngine* e, const BtContextHandle& btContext) :BtContextAwareCommand(cuid, btContext), - e(e) {} + e(e), + _lowestSpeedLimit(20*1024) {} PeerListenCommand::~PeerListenCommand() {} @@ -77,8 +78,11 @@ bool PeerListenCommand::execute() { peerSocket->getPeerInfo(peerInfo); pair localInfo; peerSocket->getAddrInfo(localInfo); + + TransferStat tstat = peerStorage->calculateStat(); if(peerInfo.first != localInfo.first && - btRuntime->getConnections() < MAX_PEERS) { + (!pieceStorage->downloadFinished() && tstat.getDownloadSpeed() < _lowestSpeedLimit || + btRuntime->getConnections() < MAX_PEERS)) { PeerHandle peer = PeerHandle(new Peer(peerInfo.first, peerInfo.second, btContext->getPieceLength(), btContext->getTotalLength())); diff --git a/src/PeerListenCommand.h b/src/PeerListenCommand.h index 1ae2de91..815b622f 100644 --- a/src/PeerListenCommand.h +++ b/src/PeerListenCommand.h @@ -42,6 +42,7 @@ class PeerListenCommand : public BtContextAwareCommand { private: TorrentDownloadEngine* e; SocketHandle socket; + int32_t _lowestSpeedLimit; public: PeerListenCommand(int cuid, TorrentDownloadEngine* e, @@ -52,6 +53,11 @@ public: bool execute(); int bindPort(int portRangeStart, int portRangeEnd); + + void setLowestSpeedLimit(int32_t speed) + { + _lowestSpeedLimit = speed; + } }; #endif // _D_PEER_LISTEN_COMMAND_H_