Changeset 93
- Timestamp:
- Feb 7, 2006, 3:10:42 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/choking.c
r90 r93 50 50 else 51 51 /* Reckon a number of slots from the upload limit. There is no 52 official right way to do this, the formula abovee.g. gives:52 official right way to do this, the formula below e.g. gives: 53 53 10 KB/s -> 4 * 2.50 KB/s 54 54 20 KB/s -> 6 * 3.33 KB/s … … 59 59 } 60 60 61 static inline void sortPeers( tr_peer_t ** peers, int count ) 62 { 63 int i, j; 61 #define sortPeersAscending(p,c) sortPeers(p,c,0) 62 #define sortPeersDescending(p,c) sortPeers(p,c,1) 63 static inline void sortPeers( tr_peer_t ** peers, int count, int order ) 64 { 65 int i, j, sorted; 66 float rate1, rate2; 64 67 tr_peer_t * tmp; 65 68 66 69 for( i = count - 1; i > 0; i-- ) 70 { 71 sorted = 1; 67 72 for( j = 0; j < i; j++ ) 68 73 { 69 if( tr_peerDownloadRate( peers[j] ) > 70 tr_peerDownloadRate( peers[j+1] ) ) 74 rate1 = tr_peerDownloadRate( peers[j] ); 75 rate2 = tr_peerDownloadRate( peers[j+1] ); 76 if( order ? ( rate1 < rate2 ) : ( rate1 > rate2 ) ) 71 77 { 72 78 tmp = peers[j]; 73 79 peers[j] = peers[j+1]; 74 80 peers[j+1] = tmp; 81 sorted = 0; 75 82 } 76 83 } 84 if( sorted ) 85 break; 86 } 77 87 } 78 88 … … 140 150 141 151 /* Sort peers by the rate we are downloading from them. */ 142 sortPeers ( peersCanChoke, peersCanChokeCount );143 sortPeers ( peersCanUnchoke, peersCanUnchokeCount );152 sortPeersDescending( peersCanChoke, peersCanChokeCount ); 153 sortPeersAscending( peersCanUnchoke, peersCanUnchokeCount ); 144 154 145 155 if( unchokedCount > c->slots && peersCanChokeCount > 0 ) 146 156 { 147 157 /* We have more open slots than what we should have (the user 148 has just lower his upload limit. We need to choke some of the158 has just lowered his upload limit. We need to choke some of the 149 159 peers we are uploading to. */ 150 160 int willChoke; 151 161 willChoke = MIN( peersCanChokeCount, unchokedCount - c->slots ); 152 162 for( i = 0; i < willChoke; i++ ) 153 tr_peerChoke( peersCanChoke[i] ); 154 peersCanChokeCount -= willChoke; 155 memmove( &peersCanChoke[0], &peersCanChoke[willChoke], 156 peersCanChokeCount * sizeof( tr_peer_t * ) ); 163 tr_peerChoke( peersCanChoke[--peersCanChokeCount] ); 157 164 } 158 165 else if( unchokedCount < c->slots && peersCanUnchokeCount > 0 ) … … 162 169 willUnchoke = MIN( peersCanUnchokeCount, c->slots - unchokedCount ); 163 170 for( i = 0; i < willUnchoke; i++ ) 164 tr_peerUnchoke( peersCanUnchoke[peersCanUnchokeCount - i - 1] ); 165 peersCanUnchokeCount -= willUnchoke; 171 tr_peerUnchoke( peersCanUnchoke[--peersCanUnchokeCount] ); 166 172 } 167 173 … … 172 178 uploading more to us. */ 173 179 if( tr_peerDownloadRate( peersCanUnchoke[peersCanUnchokeCount - 1] ) 174 < tr_peerDownloadRate( peersCanChoke[ 0] ) )180 < tr_peerDownloadRate( peersCanChoke[peersCanChokeCount - 1] ) ) 175 181 break; 176 182 177 tr_peerChoke( peersCanChoke[0] ); 178 tr_peerUnchoke( peersCanUnchoke[peersCanUnchokeCount - 1] ); 179 peersCanChokeCount--; 180 peersCanUnchokeCount--; 181 memmove( &peersCanChoke[0], &peersCanChoke[1], 182 peersCanChokeCount * sizeof( tr_peer_t * ) ); 183 tr_peerChoke( peersCanChoke[--peersCanChokeCount] ); 184 tr_peerUnchoke( peersCanUnchoke[--peersCanUnchokeCount] ); 183 185 } 184 186
Note: See TracChangeset
for help on using the changeset viewer.