Changeset 12063


Ignore:
Timestamp:
Mar 2, 2011, 7:21:58 AM (11 years ago)
Author:
jordan
Message:

(trunk libT) work in progress, but this is a slightly better speed limiting for mixed tcp/utp peers

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/bandwidth.c

    r11709 r12063  
    1919#include "peer-io.h"
    2020#include "ptrarray.h"
     21#include "session.h"
    2122#include "utils.h"
    2223
     
    215216    while( n > 1 )
    216217    {
    217         const size_t increment = 1024;
     218        const size_t increment = 256;//1024;
    218219        const int bytesUsed = tr_peerIoFlush( peers[i], dir, increment );
    219220
     
    306307***/
    307308
     309static unsigned int
     310bandwidthClamp( const tr_bandwidth  * b,
     311                const uint64_t        now,
     312                tr_direction          dir,
     313                unsigned int          byteCount )
     314{
     315    assert( tr_isBandwidth( b ) );
     316    assert( tr_isDirection( dir ) );
     317
     318    if( b )
     319    {
     320        if( b->band[dir].isLimited )
     321        {
     322            double current = tr_bandwidthGetRawSpeed_Bps( b, now, TR_DOWN );
     323            double desired = tr_bandwidthGetDesiredSpeed_Bps( b, TR_DOWN );
     324            double r = desired > 0.001 ? current / desired : 0;
     325            size_t i;
     326                 if( r > 1.0 ) i = 0;
     327            else if( r > 0.9 ) i = byteCount * 0.9;
     328            else if( r > 0.8 ) i = byteCount * 0.8;
     329            else               i = byteCount;
     330
     331            byteCount = MIN( byteCount, b->band[dir].bytesLeft );
     332
     333            //fprintf( stderr, "--> %.4f  (%f... %f) [%zu --> %zu]\n", r, current, desired, byteCount, i );
     334            byteCount = i;
     335        }
     336
     337        if( b->parent && b->band[dir].honorParentLimits && ( byteCount > 0 ) )
     338            byteCount = bandwidthClamp( b->parent, now, dir, byteCount );
     339    }
     340
     341    return byteCount;
     342}
    308343unsigned int
    309344tr_bandwidthClamp( const tr_bandwidth  * b,
     
    311346                   unsigned int          byteCount )
    312347{
    313     assert( tr_isBandwidth( b ) );
    314     assert( tr_isDirection( dir ) );
    315 
    316     if( b )
    317     {
    318         if( b->band[dir].isLimited )
    319             byteCount = MIN( byteCount, b->band[dir].bytesLeft );
    320 
    321         if( b->parent && b->band[dir].honorParentLimits )
    322             byteCount = tr_bandwidthClamp( b->parent, dir, byteCount );
    323     }
    324 
    325     return byteCount;
    326 }
     348    const uint64_t now_msec = tr_time_msec( );
     349    return bandwidthClamp( b, now_msec, dir, byteCount );
     350}
     351
    327352
    328353unsigned int
Note: See TracChangeset for help on using the changeset viewer.