From: Charles Kerr Date: Tue, 18 Aug 2009 01:57:17 +0000 (+0000) Subject: (trunk libT) better throttling back of outgoing download requests when speed limits... X-Git-Tag: 1.74~30 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6dedb0433b534c2ecfac87dcd57b270d73987b74;p=transmission (trunk libT) better throttling back of outgoing download requests when speed limits are turned on --- diff --git a/libtransmission/peer-msgs.c b/libtransmission/peer-msgs.c index 5c4e81147..4b39265c5 100644 --- a/libtransmission/peer-msgs.c +++ b/libtransmission/peer-msgs.c @@ -1673,12 +1673,24 @@ canRead( tr_peerIo * io, void * vmsgs, size_t * piece ) static int ratePulse( tr_peermsgs * msgs, uint64_t now ) { - const double rateToClient = tr_peerGetPieceSpeed( msgs->peer, now, TR_PEER_TO_CLIENT ); - const int seconds = 10; + int irate; const int floor = 8; - const int estimatedBlocksInPeriod = ( rateToClient * seconds * 1024 ) / msgs->torrent->blockSize; - - msgs->maxActiveRequests = floor + estimatedBlocksInPeriod; + const int seconds = 10; + double rate; + int estimatedBlocksInPeriod; + const tr_torrent * const torrent = msgs->torrent; + + /* Get the rate limit we should use. + * FIXME: this needs to consider all the other peers as well... */ + rate = tr_peerGetPieceSpeed( msgs->peer, now, TR_PEER_TO_CLIENT ); + if( tr_torrentUsesSpeedLimit( torrent, TR_PEER_TO_CLIENT ) ) + rate = MIN( rate, tr_torrentGetSpeedLimit( torrent, TR_PEER_TO_CLIENT ) ); + if( tr_torrentUsesSessionLimits( torrent ) ) + if( tr_sessionGetActiveSpeedLimit( torrent->session, TR_PEER_TO_CLIENT, &irate ) ) + rate = MIN( rate, irate ); + + estimatedBlocksInPeriod = ( rate * seconds * 1024 ) / torrent->blockSize; + msgs->maxActiveRequests = MAX( floor, estimatedBlocksInPeriod ); if( msgs->reqq > 0 ) msgs->maxActiveRequests = MIN( msgs->maxActiveRequests, msgs->reqq );