Changeset 109


Ignore:
Timestamp:
Feb 8, 2006, 10:21:58 PM (15 years ago)
Author:
titer
Message:

Added optimistic choking

Location:
trunk/libtransmission
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/choking.c

    r108 r109  
    139139void tr_chokingPulse( tr_choking_t * c )
    140140{
    141     int i, peersTotalCount, unchoked;
     141    int i, peersTotalCount, unchoked, mustOptimistic = 1;
    142142    tr_peer_t ** canChoke, ** canUnchoke;
    143143    tr_peer_t ** canChokeZero, ** canUnchokeZero;
     
    183183            {
    184184                if( tr_peerIsUnchoked( peer ) )
     185                {
    185186                    tr_peerChoke( peer );
     187                    tr_peerSetOptimistic( peer, 0 );
     188                }
    186189                continue;
    187190            }
     
    193196            if( tr_peerIsUnchoked( peer ) )
    194197            {
     198                if( tr_peerIsOptimistic( peer ) )
     199                {
     200                    if( tr_peerLastChoke( peer ) + 30000 < now )
     201                    {
     202                        /* He got his 30 seconds, now we see him like
     203                           any other unchoked peer */
     204                        tr_peerSetOptimistic( peer, 0 );
     205                    }
     206                    else
     207                    {
     208                        /* Keep him unchoked for 30 seconds */
     209                        mustOptimistic = 0;
     210                        continue;
     211                    }
     212                }
     213
    195214                unchoked++;
    196215                if( tr_peerLastChoke( peer ) + 10000 < now )
     
    220239    free( canUnchoke );
    221240
     241    if( mustOptimistic )
     242    {
     243        tr_peer_t * peer;
     244
     245        /* Open an extra slot for optimistic choking */
     246        if( canUnchokeZeroCount )
     247        {
     248            /* TODO: prefer peers with no pieces at all */
     249            peer = canUnchokeZero[--canUnchokeZeroCount];
     250            tr_peerUnchoke( peer );
     251            tr_peerSetOptimistic( peer, 1 );
     252        }
     253        else if( canUnchokeNonZeroCount )
     254        {
     255            peer = canUnchokeNonZero[--canUnchokeNonZeroCount];
     256            tr_peerUnchoke( peer );
     257            tr_peerSetOptimistic( peer, 1 );
     258        }
     259    }
     260
    222261    /* If we have more open slots than what we should have (the user has
    223262       just lowered his upload limit), we need to choke some of the
  • trunk/libtransmission/peer.c

    r65 r109  
    5454    char           peerInterested;
    5555
     56    int            optimistic;
    5657    uint64_t       lastChoke;
    5758
     
    490491    return peer->lastChoke;
    491492}
     493
     494void tr_peerSetOptimistic( tr_peer_t * peer, int o )
     495{
     496    peer->optimistic = o;
     497}
     498
     499int tr_peerIsOptimistic( tr_peer_t * peer )
     500{
     501    return peer->optimistic;
     502}
  • trunk/libtransmission/peer.h

    r65 r109  
    4545void        tr_peerUnchoke       ( tr_peer_t * );
    4646uint64_t    tr_peerLastChoke     ( tr_peer_t * );
     47void        tr_peerSetOptimistic ( tr_peer_t *, int );
     48int         tr_peerIsOptimistic  ( tr_peer_t * );
    4749
    4850#endif
Note: See TracChangeset for help on using the changeset viewer.