From ea668ca9ff75aa483589d0c7aa2b6d53130dcdef Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Mon, 20 Oct 2008 03:47:48 +0000 Subject: [PATCH] (libT) possible fix for the up/down display inconsistency reported by BentMyWookie. --- libtransmission/peer-mgr.c | 21 ++---- libtransmission/peer-mgr.h | 146 +++++++++++++++---------------------- libtransmission/torrent.c | 25 ++++++- 3 files changed, 89 insertions(+), 103 deletions(-) diff --git a/libtransmission/peer-mgr.c b/libtransmission/peer-mgr.c index a85117969..8df7ea060 100644 --- a/libtransmission/peer-mgr.c +++ b/libtransmission/peer-mgr.c @@ -1655,9 +1655,7 @@ tr_peerMgrTorrentStats( const tr_peerMgr * manager, int * setmeWebseedsSendingToUs, int * setmePeersSendingToUs, int * setmePeersGettingFromUs, - int * setmePeersFrom, - double * setmeRateToClient, - double * setmeRateToPeers ) + int * setmePeersFrom ) { int i, size; const Torrent * t; @@ -1675,8 +1673,6 @@ tr_peerMgrTorrentStats( const tr_peerMgr * manager, *setmePeersGettingFromUs = 0; *setmePeersSendingToUs = 0; *setmeWebseedsSendingToUs = 0; - *setmeRateToClient = 0; - *setmeRateToPeers = 0; for( i = 0; i < TR_PEER_FROM__MAX; ++i ) setmePeersFrom[i] = 0; @@ -1701,10 +1697,6 @@ tr_peerMgrTorrentStats( const tr_peerMgr * manager, if( atom->flags & ADDED_F_SEED_FLAG ) ++ * setmeSeedsConnected; - - *setmeRateToClient += tr_peerIoGetRateToClient( peer->io ); - - *setmeRateToPeers += tr_peerIoGetRateToPeer( peer->io ); } webseeds = (const tr_webseed **) tr_ptrArrayPeek( t->webseeds, &size ); @@ -2506,6 +2498,9 @@ allocateBandwidth( tr_peerMgr * mgr, const size_t used = countPeerBandwidth( t->peers, direction ); countHandshakeBandwidth( t->outgoingHandshakes, direction ); + /* remember this torrent's bytes used */ + t->tor->rateHistory[direction][pulseNumber] = used; + /* add this torrent's bandwidth use to allBytesUsed */ allBytesUsed += used; @@ -2517,12 +2512,10 @@ allocateBandwidth( tr_peerMgr * mgr, break; case TR_SPEEDLIMIT_SINGLE: - t->tor->rateHistory[direction][pulseNumber] = used; - setPeerBandwidth( t->peers, direction, - t->tor->rateHistory[direction], - tr_torrentGetSpeedLimit( t->tor, - direction ) ); + t->tor->rateHistory[direction], + tr_torrentGetSpeedLimit( t->tor, + direction ) ); break; case TR_SPEEDLIMIT_GLOBAL: diff --git a/libtransmission/peer-mgr.h b/libtransmission/peer-mgr.h index edbcd28e7..9ef34639d 100644 --- a/libtransmission/peer-mgr.h +++ b/libtransmission/peer-mgr.h @@ -44,115 +44,89 @@ typedef struct tr_pex } tr_pex; -int tr_pexCompare( const void * a, - const void * b ); +int tr_pexCompare( const void * a, const void * b ); -tr_peerMgr* tr_peerMgrNew( struct tr_handle * ); +tr_peerMgr* tr_peerMgrNew( struct tr_handle * ); -void tr_peerMgrFree( tr_peerMgr * manager ); +void tr_peerMgrFree( tr_peerMgr * manager ); -int tr_peerMgrPeerIsSeed( - const tr_peerMgr * mgr, - const uint8_t * - torrentHash, - const struct in_addr * addr ); +int tr_peerMgrPeerIsSeed( const tr_peerMgr * mgr, + const uint8_t * torrentHash, + const struct in_addr * addr ); -void tr_peerMgrAddIncoming( tr_peerMgr * manager, - struct in_addr * addr, - uint16_t port, - int socket ); +void tr_peerMgrAddIncoming( tr_peerMgr * manager, + struct in_addr * addr, + uint16_t port, + int socket ); -tr_pex * tr_peerMgrCompactToPex( const void * compact, - size_t compactLen, - const uint8_t * added_f, - size_t added_f_len, - size_t * setme_pex_count ); +tr_pex * tr_peerMgrCompactToPex( const void * compact, + size_t compactLen, + const uint8_t * added_f, + size_t added_f_len, + size_t * setme_pex_count ); -void tr_peerMgrAddPex( tr_peerMgr * manager, - const uint8_t * torrentHash, - uint8_t from, - const tr_pex * pex ); +void tr_peerMgrAddPex( tr_peerMgr * manager, + const uint8_t * torrentHash, + uint8_t from, + const tr_pex * pex ); -void tr_peerMgrSetBlame( tr_peerMgr * manager, - const uint8_t * torrentHash, - tr_piece_index_t pieceIndex, - int success ); +void tr_peerMgrSetBlame( tr_peerMgr * manager, + const uint8_t * torrentHash, + tr_piece_index_t pieceIndex, + int success ); -int tr_peerMgrGetPeers( tr_peerMgr * manager, - const uint8_t * torrentHash, - tr_pex ** setme_pex ); +int tr_peerMgrGetPeers( tr_peerMgr * manager, + const uint8_t * torrentHash, + tr_pex ** setme_pex ); -void tr_peerMgrStartTorrent( tr_peerMgr * manager, - const uint8_t * torrentHash ); +void tr_peerMgrStartTorrent( tr_peerMgr * manager, + const uint8_t * torrentHash ); -void tr_peerMgrStopTorrent( tr_peerMgr * manager, - const uint8_t * torrentHash ); +void tr_peerMgrStopTorrent( tr_peerMgr * manager, + const uint8_t * torrentHash ); -void tr_peerMgrAddTorrent( tr_peerMgr * manager, - struct tr_torrent * tor ); +void tr_peerMgrAddTorrent( tr_peerMgr * manager, + struct tr_torrent * tor ); -void tr_peerMgrRemoveTorrent( tr_peerMgr * manager, - const uint8_t * torrentHash ); +void tr_peerMgrRemoveTorrent( tr_peerMgr * manager, + const uint8_t * torrentHash ); -void tr_peerMgrTorrentAvailability( - const tr_peerMgr * manager, - const uint8_t * - torrentHash, - int8_t * tab, - unsigned int - tabCount ); +void tr_peerMgrTorrentAvailability( const tr_peerMgr * manager, + const uint8_t * torrentHash, + int8_t * tab, + unsigned int tabCount ); struct tr_bitfield* tr_peerMgrGetAvailable( const tr_peerMgr * manager, const uint8_t * torrentHash ); -int tr_peerMgrHasConnections( - const tr_peerMgr * manager, - const uint8_t * - torrentHash ); +int tr_peerMgrHasConnections( const tr_peerMgr * manager, + const uint8_t * torrentHash ); -void tr_peerMgrTorrentStats( - const tr_peerMgr * manager, - const uint8_t * torrentHash, - int * - setmePeersKnown, - int * - setmePeersConnected, - int * - setmeSeedsConnected, - int * - setmeWebseedsSendingToUs, - int * - setmePeersSendingToUs, - int * - setmePeersGettingFromUs, - int * - setmePeersFrom, /* <-- array of - TR_PEER_FROM__MAX - */ - double * - setmeRateToClient, - double * - setmeRateToPeers ); +void tr_peerMgrTorrentStats( const tr_peerMgr * manager, + const uint8_t * torrentHash, + int * setmePeersKnown, + int * setmePeersConnected, + int * setmeSeedsConnected, + int * setmeWebseedsSendingToUs, + int * setmePeersSendingToUs, + int * setmePeersGettingFromUs, + int * setmePeersFrom ); /* TR_PEER_FROM__MAX */ -double tr_peerMgrGetRate( const tr_peerMgr * manager, - tr_direction direction ); +double tr_peerMgrGetRate( const tr_peerMgr * manager, + tr_direction direction ); -struct tr_peer_stat * tr_peerMgrPeerStats( const tr_peerMgr * manager, - const uint8_t * torrentHash, - int * setmeCount ); +struct tr_peer_stat* tr_peerMgrPeerStats( const tr_peerMgr * manager, + const uint8_t * torrentHash, + int * setmeCount ); -float* tr_peerMgrWebSpeeds( const tr_peerMgr * manager, - const uint8_t * torrentHash ); +float* tr_peerMgrWebSpeeds( const tr_peerMgr * manager, + const uint8_t * torrentHash ); -struct tr_bitfield * tr_peerMgrGenerateAllowedSet( - const uint32_t setCount, - const uint32_t - pieceCount, - const uint8_t - infohash[20], - const struct in_addr * - ip ); +struct tr_bitfield * tr_peerMgrGenerateAllowedSet( const uint32_t setCount, + const uint32_t pieceCount, + const uint8_t infohash[20], + const struct in_addr * ip ); #endif diff --git a/libtransmission/torrent.c b/libtransmission/torrent.c index b6e988c61..836086ef1 100644 --- a/libtransmission/torrent.c +++ b/libtransmission/torrent.c @@ -713,6 +713,23 @@ tr_torrentInfo( const tr_torrent * tor ) return tor ? &tor->info : NULL; } +static double +tr_torrentGetRate( const tr_torrent * tor, + tr_direction direction ) +{ + int i; + double bytes = 0; + + assert( tor != NULL ); + assert( direction == TR_UP || direction == TR_DOWN ); + + for( i = 0; i < BANDWIDTH_PULSE_HISTORY; ++i ) + bytes += tor->rateHistory[direction][i]; + + return ( BANDWIDTH_PULSES_PER_SECOND * bytes ) + / ( BANDWIDTH_PULSE_HISTORY * 1024 ); +} + const tr_stat * tr_torrentStatCached( tr_torrent * tor ) { @@ -777,9 +794,11 @@ tr_torrentStat( tr_torrent * tor ) &s->webseedsSendingToUs, &s->peersSendingToUs, &s->peersGettingFromUs, - s->peersFrom, - &s->rateDownload, - &s->rateUpload ); + s->peersFrom ); + + s->rateDownload = tr_torrentGetRate( tor, TR_PEER_TO_CLIENT ); + + s->rateUpload = tr_torrentGetRate( tor, TR_CLIENT_TO_PEER ); usableSeeds += tor->info.webseedCount;