Changeset 7130


Ignore:
Timestamp:
Nov 20, 2008, 3:07:26 AM (12 years ago)
Author:
charles
Message:

(libT) another possible fix for #1468: Speed display is very jumpy

Location:
trunk/libtransmission
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/peer-io.c

    r7125 r7130  
    155155        EVBUFFER_LENGTH( live ) = desiredLength;
    156156    }
    157     else if( EVBUFFER_LENGTH( live ) )
     157
     158    if( EVBUFFER_LENGTH( live ) )
    158159    {
    159160        bufferevent_enable( io->bufev, EV_WRITE );
  • trunk/libtransmission/peer-mgr.c

    r7125 r7130  
    23712371    const double baseline_bytes_per_pulse = desired_average_kb_per_sec * 1024.0 * seconds_per_pulse;
    23722372    const double min = baseline_bytes_per_pulse * 0.80;
    2373     const double max = baseline_bytes_per_pulse * 1.10;
     2373    const double max = baseline_bytes_per_pulse * 1.20;
    23742374    const double current_bytes_per_pulse = tr_rcRate( ratecontrol ) * 1024.0 * seconds_per_pulse;
    23752375    const double next_pulse_bytes = baseline_bytes_per_pulse * ( pulses_per_history + 1 )
     
    24122412    const double meritBytes = MAX( 0, bytes - welfareBytes );
    24132413    tr_peer **   peers = (tr_peer**) tr_ptrArrayBase( peerArray );
    2414     tr_peer **   candidates = tr_new( tr_peer *, peerCount );
    24152414    int          i;
    2416     int          candidateCount;
    24172415    double       welfare;
    24182416    size_t       bytesUsed;
     
    24222420    assert( direction == TR_UP || direction == TR_DOWN );
    24232421
    2424     for( i = candidateCount = 0; i < peerCount; ++i )
    2425         if( tr_peerIoWantsBandwidth( peers[i]->io, direction ) )
    2426             candidates[candidateCount++] = peers[i];
    2427         else
    2428             tr_peerIoSetBandwidth( peers[i]->io, direction, 0 );
    2429 
    2430     for( i = bytesUsed = 0; i < candidateCount; ++i )
    2431         bytesUsed += tr_peerIoGetBandwidthUsed( candidates[i]->io,
    2432                                                 direction );
    2433 
    2434     welfare = welfareBytes / candidateCount;
    2435 
    2436     for( i = 0; i < candidateCount; ++i )
    2437     {
    2438         tr_peer *    peer = candidates[i];
     2422    for( i=bytesUsed=0; i<peerCount; ++i )
     2423        bytesUsed += tr_peerIoGetBandwidthUsed( peers[i]->io, direction );
     2424
     2425   welfare = welfareBytes / peerCount;
     2426
     2427    for( i=0; i<peerCount; ++i )
     2428    {
     2429        tr_peer * peer = peers[i];
    24392430        const double merit = bytesUsed
    2440                              ? ( meritBytes *
    2441                                 tr_peerIoGetBandwidthUsed( peer->io,
    2442                                                            direction ) ) /
    2443                              bytesUsed
    2444                              : ( meritBytes / candidateCount );
     2431                           ? ( meritBytes * tr_peerIoGetBandwidthUsed( peer->io, direction ) ) / bytesUsed
     2432                           : ( meritBytes / peerCount );
    24452433        tr_peerIoSetBandwidth( peer->io, direction, merit + welfare );
    24462434    }
    2447 
    2448     /* cleanup */
    2449     tr_free( candidates );
    24502435}
    24512436
     
    25112496        }
    25122497    }
     2498}
     2499
     2500static void
     2501getBandwidthPeers( Torrent       * t,
     2502                   tr_direction    direction,
     2503                   tr_ptrArray   * appendme )
     2504{
     2505    int i, peerCount;
     2506    tr_peer ** peers;
     2507
     2508    assert( torrentIsLocked( t ) );
     2509
     2510    peers = (tr_peer **) tr_ptrArrayPeek( t->peers, &peerCount );
     2511
     2512    for( i=0; i<peerCount; ++i )
     2513        if( peers[i]->msgs )
     2514            if(    ( ( direction == TR_PEER_TO_CLIENT ) && clientIsDownloadingFrom( peers[i] ) )
     2515                || ( ( direction == TR_CLIENT_TO_PEER ) && clientIsUploadingTo( peers[i] ) ) )
     2516                    tr_ptrArrayAppend( appendme, peers[i] );
    25132517}
    25142518
     
    25722576
    25732577            case TR_SPEEDLIMIT_SINGLE:
    2574                 setPeerBandwidth( t->peers, direction,
     2578            {
     2579                tr_ptrArray * peers = tr_ptrArrayNew( );
     2580                getBandwidthPeers( t, direction, peers );
     2581                setPeerBandwidth( peers, direction,
    25752582                                  t->tor->rawSpeed[direction],
    25762583                                  tr_torrentGetSpeedLimit( t->tor, direction ) );
     2584                tr_ptrArrayFree( peers, NULL );
    25772585                break;
     2586            }
    25782587
    25792588            case TR_SPEEDLIMIT_GLOBAL:
    2580             {
    2581                 int       i;
    2582                 const int n = tr_ptrArraySize( t->peers );
    2583                 for( i = 0; i < n; ++i )
    2584                     tr_ptrArrayAppend( globalPool,
    2585                                       tr_ptrArrayNth( t->peers, i ) );
     2589                getBandwidthPeers( t, direction, globalPool );
    25862590                poolBytesUsed += used;
    25872591                break;
    2588             }
    25892592        }
    25902593    }
  • trunk/libtransmission/peer-msgs.c

    r7125 r7130  
    18351835    field = tr_bitfieldDup( tr_cpPieceBitfield( msgs->torrent->completion ) );
    18361836
     1837#if 0
    18371838    if( tr_sessionIsLazyBitfieldEnabled( msgs->session ) )
    18381839    {
     
    18621863        tr_free( pool );
    18631864    }
     1865#endif
    18641866
    18651867    tr_peerIoWriteUint32( msgs->io, out,
Note: See TracChangeset for help on using the changeset viewer.