Ticket #671: r6960_queue.patch

File r6960_queue.patch, 16.6 KB (added by dzimi, 13 years ago)

Applyable patch for r6960 - only queue

  • libtransmission/resume.c

    diff -urN Transmission.orig/libtransmission/resume.c Transmission/libtransmission/resume.c
    old new  
    407407    tr_bencDictAddInt( &top, KEY_MAX_PEERS,
    408408                       tor->maxConnectedPeers );
    409409    tr_bencDictAddInt( &top, KEY_PAUSED,
    410                        tor->isRunning ? 0 : 1 );
     410                       ( tor->isRunning || tor->isQueued ) ? 0 : 1 );
    411411    savePeers( &top, tor );
    412412    savePriorities( &top, tor );
    413413    saveDND( &top, tor );
  • libtransmission/rpcimpl.c

    diff -urN Transmission.orig/libtransmission/rpcimpl.c Transmission/libtransmission/rpcimpl.c
    old new  
    644644
    645645    if( tr_bencDictFindStr( args_in, "download-dir", &str ) )
    646646        tr_sessionSetDownloadDir( h, str );
     647    if( tr_bencDictFindInt( args_in, "max-download-active", &i ) )
     648        tr_sessionSetMaxDownloadActive( h, i );
     649    if( tr_bencDictFindInt( args_in, "max-seed-active", &i ) )
     650        tr_sessionSetMaxSeedActive( h, i );
    647651    if( tr_bencDictFindInt( args_in, "peer-limit", &i ) )
    648652        tr_sessionSetPeerLimit( h, i );
    649653    if( tr_bencDictFindInt( args_in, "pex-allowed", &i ) )
     
    712716
    713717    tr_bencDictAddStr( d, "download-dir",
    714718                      tr_sessionGetDownloadDir( h ) );
     719    tr_bencDictAddInt( d, "max-download-active",
     720                      tr_sessionGetMaxDownloadActive( h ) );
     721    tr_bencDictAddInt( d, "max-seed-active",
     722                      tr_sessionGetMaxSeedActive( h ) );
    715723    tr_bencDictAddInt( d, "peer-limit",
    716724                      tr_sessionGetPeerLimit( h ) );
    717725    tr_bencDictAddInt( d, "pex-allowed",
  • libtransmission/session.c

    diff -urN Transmission.orig/libtransmission/session.c Transmission/libtransmission/session.c
    old new  
    204204                    int                publicPort,
    205205                    tr_encryption_mode encryptionMode,
    206206                    int                useLazyBitfield,
     207                    int                maxSeedActive,
     208                    int                maxDownloadActive,
    207209                    int                useUploadLimit,
    208210                    int                uploadLimit,
    209211                    int                useDownloadLimit,
     
    264266    while( !h->events )
    265267        tr_wait( 50 );
    266268
     269    tr_queuePulseInit( h );
     270
    267271    h->tag = tr_strdup( tag );
    268272    h->peerMgr = tr_peerMgrNew( h );
    269273
     
    291295    h->isBlocklistEnabled = isBlocklistEnabled;
    292296    loadBlocklists( h );
    293297
     298    h->maxDownloadActive = maxDownloadActive;
     299    h->maxSeedActive = maxSeedActive;
     300
    294301    tr_statsInit( h );
    295302
    296303    h->web = tr_webInit( h );
     
    316323                               -1, /* public port */
    317324                               TR_DEFAULT_ENCRYPTION, /* encryption mode */
    318325                               TR_DEFAULT_LAZY_BITFIELD_ENABLED,
     326                               TR_DEFAULT_MAX_SEED_ACTIVE,
     327                               TR_DEFAULT_MAX_DOWNLOAD_ACTIVE,
    319328                               FALSE, /* use upload speed limit? */
    320329                               -1, /* upload speed limit */
    321330                               FALSE, /* use download speed limit? */
     
    11691178    }
    11701179}
    11711180
     1181/***
     1182****
     1183***/
     1184
     1185int
     1186tr_sessionGetMaxSeedActive( const tr_session * session )
     1187{
     1188    return session->maxSeedActive;
     1189}
     1190
     1191void
     1192tr_sessionSetMaxSeedActive( tr_session * session , int maxActive)
     1193{
     1194    session->maxSeedActive = maxActive;
     1195}
     1196
     1197int
     1198tr_sessionGetMaxDownloadActive( const tr_session * session )
     1199{
     1200    return session->maxDownloadActive;
     1201}
     1202
     1203void
     1204tr_sessionSetMaxDownloadActive( tr_session * session , int maxActive)
     1205{
     1206    session->maxDownloadActive = maxActive;
     1207}
     1208
     1209int
     1210tr_sessionActiveTorrentLimitReached( tr_session * session, tr_torrent * tor )
     1211{
     1212    if( tr_torrentIsSeed( tor ) )
     1213        return( session->activeSeedCount >= session->maxSeedActive );
     1214    else
     1215        return ( session->activeDownloadCount >= session->maxDownloadActive );
     1216}
     1217
     1218void
     1219tr_sessionDecrementActiveCount( tr_session * session, tr_torrent * tor )
     1220{
     1221    if( tr_torrentIsSeed( tor ) )
     1222        session->activeSeedCount--;
     1223    else
     1224        session->activeDownloadCount--;
     1225        fprintf(stderr, "Decrement Torrent Count dl: %2d ul: %2d\n", session->activeDownloadCount, session->activeSeedCount );
     1226}
     1227
     1228void
     1229tr_sessionIncrementActiveCount( tr_session * session, tr_torrent * tor )
     1230{
     1231    if( tr_torrentIsSeed( tor ) )
     1232        session->activeSeedCount++;
     1233    else
     1234        session->activeDownloadCount++;
     1235    fprintf(stderr, "Increment Torrent Count dl: %2d ul: %2d\n", session->activeDownloadCount, session->activeSeedCount );
     1236}
     1237
     1238void
     1239tr_sessionDownToSeedActiveCount( tr_session * session)
     1240{
     1241    session->activeSeedCount++;
     1242    session->activeDownloadCount--;
     1243    fprintf(stderr, "DownToSeed Torrent Count dl: %2d ul: %2d\n", session->activeDownloadCount, session->activeSeedCount );
     1244}
  • libtransmission/session.h

    diff -urN Transmission.orig/libtransmission/session.h Transmission/libtransmission/session.h
    old new  
    7676    int                          proxyPort;
    7777    int                          peerSocketTOS;
    7878
     79    int                          maxDownloadActive;
     80    int                          maxSeedActive;
     81    int                          activeDownloadCount;
     82    int                          activeSeedCount;
     83
    7984    int                          torrentCount;
    8085    tr_torrent *                 torrentList;
    8186
     
    125130int          tr_sessionIsAddressBlocked( const tr_session *     session,
    126131                                         const struct in_addr * addr );
    127132
     133int tr_sessionGetMaxSeedActive( const tr_session * session );
     134void tr_sessionSetMaxSeedActive( tr_session * session, int maxActive );
     135int tr_sessionGetMaxDownloadActive( const tr_session * session );
     136void tr_sessionSetMaxDownloadActive( tr_session * session, int maxActive );
     137void tr_sessionDecrementActiveCount( tr_session * session, tr_torrent * tor );
     138void tr_sessionIncrementActiveCount( tr_session * session, tr_torrent * tor);
     139int tr_sessionActiveTorrentLimitReached( tr_session * session, tr_torrent * tor );
     140void tr_sessionDownToSeedActiveCount( tr_session * session );
    128141
    129142void         tr_globalLock( tr_session * );
    130143
  • libtransmission/torrent.c

    diff -urN Transmission.orig/libtransmission/torrent.c Transmission/libtransmission/torrent.c
    old new  
    4747#include "verify.h"
    4848
    4949#define MAX_BLOCK_SIZE ( 1024 * 16 )
     50#define QUEUE_PULSE_DELAY 1000
    5051
    5152/***
    5253****
     
    448449    return b;
    449450}
    450451
     452static void
     453torrentQueue( tr_torrent * tor );
     454
    451455static void
    452456torrentRealInit( tr_handle *     h,
    453457                 tr_torrent *    tor,
     
    581585    tr_metainfoMigrate( h, &tor->info );
    582586
    583587    if( doStart )
    584         torrentStart( tor, FALSE );
     588        torrentQueue( tor );
    585589}
    586590
    587591int
     
    748752        return TR_STATUS_CHECK;
    749753    if( tor->verifyState == TR_VERIFY_WAIT )
    750754        return TR_STATUS_CHECK_WAIT;
     755    if( tor->isQueued )
     756        return TR_STATUS_QUEUED;
    751757    if( !tor->isRunning )
    752758        return TR_STATUS_STOPPED;
    753759    if( tor->completeness == TR_CP_INCOMPLETE )
     
    11171123}
    11181124
    11191125static void
     1126torrentQueue( tr_torrent * tor )
     1127{
     1128//  if( !TR_STATUS_IS_ACTIVE( tr_torrentGetStatus( tor ) ) )
     1129    if( !TR_STATUS_IS_ACTIVE( tr_torrentGetActivity( tor ) ) )
     1130    {
     1131        fprintf(stderr, "Queueing Torrent\n");
     1132        tor->isQueued = 1;
     1133    }
     1134}
     1135
     1136static void
    11201137torrentStart( tr_torrent * tor,
    11211138              int          reloadProgress )
    11221139{
     
    11271144        if( reloadProgress )
    11281145            tr_torrentLoadResume( tor, TR_FR_PROGRESS, NULL );
    11291146        tor->isRunning = 1;
     1147        tr_sessionIncrementActiveCount( tor->session , tor );
    11301148        tr_verifyAdd( tor, checkAndStartCB );
    11311149    }
    11321150
     
    11371155tr_torrentStart( tr_torrent * tor )
    11381156{
    11391157    if( tor )
    1140         torrentStart( tor, TRUE );
     1158        torrentQueue( tor );
     1159}
     1160
     1161void
     1162tr_torrentForceStart( tr_torrent * tor )
     1163{
     1164    if( tor )
     1165        torrentStart( tor , TRUE );
    11411166}
    11421167
    11431168static void
     
    11931218        tr_globalLock( tor->session );
    11941219
    11951220        tor->isRunning = 0;
     1221        tr_sessionDecrementActiveCount( tor->session , tor );
    11961222        if( !tor->isDeleting )
    11971223            tr_torrentSaveResume( tor );
    11981224        tr_runInEventThread( tor->session, stopTorrent, tor );
     
    13081334
    13091335        if( recentChange )
    13101336        {
     1337            tr_sessionDownToSeedActiveCount( tor->session );
    13111338            tr_torinf( tor, _( "State changed from \"%1$s\" to \"%2$s\"" ),
    13121339                      getCompletionString( tor->completeness ),
    13131340                      getCompletionString( completeness ) );
     
    17611788    tor->doneDate = t;
    17621789}
    17631790
     1791static int
     1792queuePulseFunc( void * vhandle )
     1793{
     1794    tr_session * session = (tr_session *)vhandle;
     1795    tr_torrent * tor;
     1796
     1797    for( tor = session->torrentList; tor; tor = tor->next ) {
     1798        if ( tr_torrentGetActivity( tor ) == TR_STATUS_QUEUED &&
     1799            !tr_sessionActiveTorrentLimitReached ( tor->session , tor ) )
     1800        {
     1801            fprintf(stderr, "Starting Queued Torrent\n");
     1802            tor->isQueued = 0;
     1803            torrentStart( tor, TRUE );
     1804        }
     1805    }
     1806    return 1;
     1807}
     1808
     1809void
     1810tr_queuePulseInit( tr_session * session )
     1811{
     1812    tr_timerNew( session, queuePulseFunc, session, QUEUE_PULSE_DELAY );
     1813}
  • libtransmission/torrent.h

    diff -urN Transmission.orig/libtransmission/torrent.h Transmission/libtransmission/torrent.h
    old new  
    153153time_t*          tr_torrentGetMTimes( const    tr_torrent *,
    154154                                      size_t * setmeCount );
    155155
     156// void tr_queuePulseInit( struct tr_session * session );
     157
    156158typedef enum
    157159{
    158160    TR_VERIFY_NONE,
     
    216218
    217219    unsigned int               isRunning  : 1;
    218220    unsigned int               isDeleting : 1;
    219 
     221    unsigned int               isQueued : 1;
     222   
    220223    uint16_t                   maxConnectedPeers;
    221224
    222225    tr_verify_state            verifyState;
  • libtransmission/transmission.h

    diff -urN Transmission.orig/libtransmission/transmission.h Transmission/libtransmission/transmission.h
    old new  
    114114/** @see tr_sessionInitFull */
    115115#define TR_DEFAULT_LAZY_BITFIELD_ENABLED    1
    116116/** @see tr_sessionInitFull */
     117#define TR_DEFAULT_MAX_SEED_ACTIVE          20
     118/** @see tr_sessionInitFull */
     119#define TR_DEFAULT_MAX_DOWNLOAD_ACTIVE      20
     120/** @see tr_sessionInitFull */
    117121#define TR_DEFAULT_GLOBAL_PEER_LIMIT        200
    118122/** @see tr_sessionInitFull */
    119123#define TR_DEFAULT_PEER_SOCKET_TOS          8
     
    257261                                int                publicPort,
    258262                                tr_encryption_mode encryptionMode,
    259263                                int                useLazyBitfield,
     264                                int                maxSeedActive,
     265                                int                maxDownloadActive,
    260266                                int                useUploadLimit,
    261267                                int                uploadLimit,
    262268                                int                useDownloadLimit,
     
    832838/** @brief Start a torrent */
    833839void        tr_torrentStart( tr_torrent * );
    834840
     841/** @brief Start a torrent / ignore active torrent limits */
     842void        tr_torrentForceStart( tr_torrent * );
     843
    835844/** @brief Stop (pause) a torrent */
    836845void        tr_torrentStop( tr_torrent * );
    837846
     
    11861195    TR_STATUS_CHECK        = ( 1 << 1 ), /* Checking files */
    11871196    TR_STATUS_DOWNLOAD     = ( 1 << 2 ), /* Downloading */
    11881197    TR_STATUS_SEED         = ( 1 << 3 ), /* Seeding */
    1189     TR_STATUS_STOPPED      = ( 1 << 4 )  /* Torrent is stopped */
     1198    TR_STATUS_STOPPED      = ( 1 << 4 ),  /* Torrent is stopped */
     1199    TR_STATUS_QUEUED       = ( 1 << 5 )  /* Torrent is queued to start */
    11901200}
    11911201tr_torrent_activity;
    11921202
    1193 #define TR_STATUS_IS_ACTIVE( s ) ( ( s ) != TR_STATUS_STOPPED )
     1203#define TR_STATUS_IS_ACTIVE( s ) ( ( s ) != TR_STATUS_STOPPED && ( s ) != TR_STATUS_QUEUED )
    11941204
    11951205typedef enum
    11961206{
  • Transmission

    diff -urN Transmission.orig/cli/cli.c Transmission/cli/cli.c
    old new  
    363363        peerPort,
    364364        encryptionMode,
    365365        TR_DEFAULT_LAZY_BITFIELD_ENABLED,
     366        TR_DEFAULT_MAX_SEED_ACTIVE,
     367        TR_DEFAULT_MAX_DOWNLOAD_ACTIVE,
    366368        uploadLimit >= 0,
    367369        uploadLimit,
    368370        downloadLimit >= 0,
  • daemon/daemon.c

    diff -urN Transmission.orig/daemon/daemon.c Transmission/daemon/daemon.c
    old new  
    5151#define KEY_DSPEED_ENABLED    "download-limit-enabled"
    5252#define KEY_USPEED            "upload-limit"
    5353#define KEY_USPEED_ENABLED    "upload-limit-enabled"
    54 
     54#define KEY_MAX_DOWNLOAD     "max-download-active"
     55#define KEY_MAX_SEED         "max-seed-active"
    5556#define CONFIG_FILE           "settings.json"
    5657
    5758/***
     
    111112    replaceInt( &d, KEY_USPEED_ENABLED,
    112113               tr_sessionIsSpeedLimitEnabled( s, TR_UP ) );
    113114    replaceInt( &d, KEY_ENCRYPTION,      tr_sessionGetEncryption( s ) );
     115    replaceInt( &d, KEY_MAX_DOWNLOAD,    tr_sessionGetMaxDownloadActive( s ) );
     116    replaceInt( &d, KEY_MAX_SEED,        tr_sessionGetMaxSeedActive( s ) );
    114117
    115118    tr_bencSaveJSONFile( myConfigFilename, &d );
    116119    tr_bencFree( &d );
     
    177180                  downLimited = -1;
    178181    int           encryption = -1;
    179182    int           useLazyBitfield = -1;
     183    int           maxDownloadActive = -1;
     184    int           maxSeedActive = -1;
     185
    180186    tr_ctor *     ctor;
    181187    tr_torrent ** torrents;
    182188
     
    204210    getConfigInt( dict, KEY_USPEED_ENABLED,  &upLimited,         FALSE );
    205211    getConfigInt( dict, KEY_LAZY_BITFIELD,   &useLazyBitfield,
    206212                  TR_DEFAULT_LAZY_BITFIELD_ENABLED );
     213    getConfigInt( dict, KEY_MAX_DOWNLOAD,    &maxDownloadActive,
     214                  TR_DEFAULT_MAX_DOWNLOAD_ACTIVE );
     215    getConfigInt( dict, KEY_MAX_SEED,        &maxSeedActive,     
     216                  TR_DEFAULT_MAX_SEED_ACTIVE );
    207217    getConfigInt( dict, KEY_PEER_LIMIT,      &peers,
    208218                  TR_DEFAULT_GLOBAL_PEER_LIMIT );
    209219    getConfigInt( dict, KEY_BLOCKLIST,       &blocklistEnabled,
     
    229239                                    pexEnabled, fwdEnabled, peerPort,
    230240                                    encryption,
    231241                                    useLazyBitfield,
     242                                    maxSeedActive, maxDownloadActive,
    232243                                    upLimited, upLimit,
    233244                                    downLimited, downLimit,
    234245                                    peers,
  • web/javascript/torrent.js

    diff -urN Transmission.orig/web/javascript/torrent.js Transmission/web/javascript/torrent.js
    old new  
    1616Torrent._StatusDownloading     = 4;
    1717Torrent._StatusSeeding         = 8;
    1818Torrent._StatusPaused          = 16;
     19Torrent._StatusQueued          = 32;
    1920Torrent._InfiniteTimeRemaining = 215784000; // 999 Hours - may as well be infinite
    2021
    2122Torrent.prototype =
     
    125126        isActive: function() { return this.state() != Torrent._StatusPaused; },
    126127        isDownloading: function() { return this.state() == Torrent._StatusDownloading; },
    127128        isSeeding: function() { return this.state() == Torrent._StatusSeeding; },
     129        isQueued: function() { return this.state() == Torrent._StatusQueued; },
    128130        name: function() { return this._name; },
    129131        peersSendingToUs: function() { return this._peers_sending_to_us; },
    130132        peersGettingFromUs: function() { return this._peers_getting_from_us; },
     
    147149                        case Torrent._StatusPaused:         return 'Paused';
    148150                        case Torrent._StatusChecking:       return 'Verifying local data';
    149151                        case Torrent._StatusWaitingToCheck: return 'Waiting to verify';
     152                        case Torrent._StatusQueued:         return 'Queued to start';
    150153                        default:                            return 'error';
    151154                }
    152155        },