Changeset 3876
- Timestamp:
- Nov 18, 2007, 6:15:13 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/libtransmission/peer-mgr.c
r3871 r3876 1482 1482 { 1483 1483 tr_peer * peer; 1484 doublerate;1484 int rate; 1485 1485 int preferred; 1486 1486 int doUnchoke; … … 1490 1490 compareChoke( const void * va, const void * vb ) 1491 1491 { 1492 int i;1493 1492 const struct ChokeData * a = va; 1494 1493 const struct ChokeData * b = vb; 1495 1494 1496 if(( i = (int)( 10 * ( a->rate - b->rate )))) 1497 return i; 1498 1495 /* primary key: larger speeds */ 1496 if( a->rate > b->rate ) 1497 return -1; 1498 if ( a->rate < b->rate ) 1499 return 1; 1500 1501 /* secondary key: perferred peers */ 1499 1502 if( a->preferred != b->preferred ) 1500 1503 return a->preferred ? -1 : 1; … … 1516 1519 1517 1520 static double 1518 getWeightedThroughput( const tr_peer * peer ) 1519 { 1520 /* FIXME: tweak this? */ 1521 return /* 1 * peer->rateToPeer ) 1522 +*/ ( 1 * peer->rateToClient ); 1521 getWeightedThroughput( const tr_peer * peer, int clientIsSeed ) 1522 { 1523 return (int)( 10.0 * ( clientIsSeed ? peer->rateToPeer 1524 : peer->rateToClient ) ); 1523 1525 } 1524 1526 … … 1526 1528 rechoke( Torrent * t ) 1527 1529 { 1528 int i, peerCount, size=0 ;1530 int i, peerCount, size=0, unchoked=0; 1529 1531 const time_t fibrillationTime = time(NULL) - MIN_CHOKE_PERIOD_SEC; 1530 1532 tr_peer ** peers = getConnectedPeers( t, &peerCount ); 1531 1533 struct ChokeData * choke = tr_new0( struct ChokeData, peerCount ); 1534 const int clientIsSeed = tr_torrentIsSeed( t->tor ); 1532 1535 1533 1536 assert( torrentIsLocked( t ) ); … … 1538 1541 tr_peer * peer = peers[i]; 1539 1542 struct ChokeData * node; 1540 if( peer->chokeChangedAt > fibrillationTime ) 1543 if( peer->chokeChangedAt > fibrillationTime ) { 1544 if( !peer->peerIsChoked ) 1545 ++unchoked; 1541 1546 continue; 1547 } 1542 1548 1543 1549 node = &choke[size++]; 1544 1550 node->peer = peer; 1545 1551 node->preferred = peer->peerIsInterested && !clientIsSnubbedBy(peer); 1546 node->rate = getWeightedThroughput( peer );1552 node->rate = getWeightedThroughput( peer, clientIsSeed ); 1547 1553 } 1548 1554 1549 1555 qsort( choke, size, sizeof(struct ChokeData), compareChoke ); 1550 1556 1551 for( i=0; i<size && i<NUM_UNCHOKED_PEERS_PER_TORRENT; ++i )1557 for( i=0; i<size && unchoked<NUM_UNCHOKED_PEERS_PER_TORRENT; ++i ) { 1552 1558 choke[i].doUnchoke = 1; 1559 ++unchoked; 1560 } 1553 1561 1554 1562 for( ; i<size; ++i ) { 1563 ++unchoked; 1555 1564 choke[i].doUnchoke = 1; 1556 1565 if( choke[i].peer->peerIsInterested )
Note: See TracChangeset
for help on using the changeset viewer.