From 313bd9e211de0b74968d099513e2f200d2c78286 Mon Sep 17 00:00:00 2001 From: Jordan Lee Date: Sun, 7 Aug 2011 19:24:33 +0000 Subject: [PATCH] Add a mechanism for enabling/disabling the stalled minutes feature. This is a pre-existing feature in the Mac client. --- libtransmission/rpcimpl.c | 10 ++++++++-- libtransmission/session.c | 21 +++++++++++++++++++++ libtransmission/session.h | 1 + libtransmission/torrent.c | 3 ++- libtransmission/transmission.h | 13 +++++++++++++ 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/libtransmission/rpcimpl.c b/libtransmission/rpcimpl.c index a4b784f6b..bb41217bc 100644 --- a/libtransmission/rpcimpl.c +++ b/libtransmission/rpcimpl.c @@ -1559,10 +1559,14 @@ sessionSet( tr_session * session, tr_blocklistSetURL( session, str ); if( tr_bencDictFindStr( args_in, TR_PREFS_KEY_DOWNLOAD_DIR, &str ) ) tr_sessionSetDownloadDir( session, str ); - if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_DOWNLOAD_QUEUE_ENABLED, &boolVal ) ) - tr_sessionSetQueueEnabled ( session, TR_DOWN, boolVal ); + if( tr_bencDictFindInt( args_in, TR_PREFS_KEY_QUEUE_STALLED_MINUTES, &i ) ) + tr_sessionSetQueueStalledMinutes( session, i ); + if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_QUEUE_STALLED_ENABLED, &boolVal ) ) + tr_sessionSetQueueStalledEnabled( session, boolVal ); if( tr_bencDictFindInt( args_in, TR_PREFS_KEY_DOWNLOAD_QUEUE_SIZE, &i ) ) tr_sessionSetQueueSize( session, TR_DOWN, i ); + if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_DOWNLOAD_QUEUE_ENABLED, &boolVal ) ) + tr_sessionSetQueueEnabled ( session, TR_DOWN, boolVal ); if( tr_bencDictFindStr( args_in, TR_PREFS_KEY_INCOMPLETE_DIR, &str ) ) tr_sessionSetIncompleteDir( session, str ); if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_INCOMPLETE_DIR_ENABLED, &boolVal ) ) @@ -1730,6 +1734,8 @@ sessionGet( tr_session * s, tr_bencDictAddBool( d, TR_PREFS_KEY_DSPEED_ENABLED, tr_sessionIsSpeedLimited( s, TR_DOWN ) ); tr_bencDictAddStr ( d, TR_PREFS_KEY_SCRIPT_TORRENT_DONE_FILENAME, tr_sessionGetTorrentDoneScript( s ) ); tr_bencDictAddBool( d, TR_PREFS_KEY_SCRIPT_TORRENT_DONE_ENABLED, tr_sessionIsTorrentDoneScriptEnabled( s ) ); + tr_bencDictAddInt ( d, TR_PREFS_KEY_QUEUE_STALLED_MINUTES, tr_sessionGetQueueStalledMinutes( s ) ); + tr_bencDictAddBool( d, TR_PREFS_KEY_QUEUE_STALLED_ENABLED, tr_sessionGetQueueStalledEnabled( s ) ); tr_formatter_get_units( tr_bencDictAddDict( d, "units", 0 ) ); tr_bencDictAddStr ( d, "version", LONG_VERSION_STRING ); switch( tr_sessionGetEncryption( s ) ) { diff --git a/libtransmission/session.c b/libtransmission/session.c index 430d233be..1880adcbc 100644 --- a/libtransmission/session.c +++ b/libtransmission/session.c @@ -332,6 +332,7 @@ tr_sessionGetDefaultSettings( tr_benc * d ) tr_bencDictAddBool( d, TR_PREFS_KEY_PORT_FORWARDING, true ); tr_bencDictAddInt ( d, TR_PREFS_KEY_PREALLOCATION, TR_PREALLOCATE_SPARSE ); tr_bencDictAddBool( d, TR_PREFS_KEY_PREFETCH_ENABLED, DEFAULT_PREFETCH_ENABLED ); + tr_bencDictAddBool( d, TR_PREFS_KEY_QUEUE_STALLED_ENABLED, true ); tr_bencDictAddInt ( d, TR_PREFS_KEY_QUEUE_STALLED_MINUTES, 30 ); tr_bencDictAddReal( d, TR_PREFS_KEY_RATIO, 2.0 ); tr_bencDictAddBool( d, TR_PREFS_KEY_RATIO_ENABLED, false ); @@ -402,6 +403,7 @@ tr_sessionGetSettings( tr_session * s, struct tr_benc * d ) tr_bencDictAddBool( d, TR_PREFS_KEY_PORT_FORWARDING, tr_sessionIsPortForwardingEnabled( s ) ); tr_bencDictAddInt ( d, TR_PREFS_KEY_PREALLOCATION, s->preallocationMode ); tr_bencDictAddInt ( d, TR_PREFS_KEY_PREFETCH_ENABLED, s->isPrefetchEnabled ); + tr_bencDictAddBool( d, TR_PREFS_KEY_QUEUE_STALLED_ENABLED, tr_sessionGetQueueStalledEnabled( s ) ); tr_bencDictAddInt ( d, TR_PREFS_KEY_QUEUE_STALLED_MINUTES, tr_sessionGetQueueStalledMinutes( s ) ); tr_bencDictAddReal( d, TR_PREFS_KEY_RATIO, s->desiredRatio ); tr_bencDictAddBool( d, TR_PREFS_KEY_RATIO_ENABLED, s->isRatioLimited ); @@ -792,6 +794,8 @@ sessionSetImpl( void * vdata ) /* torrent queues */ if( tr_bencDictFindInt( settings, TR_PREFS_KEY_QUEUE_STALLED_MINUTES, &i ) ) tr_sessionSetQueueStalledMinutes( session, i ); + if( tr_bencDictFindBool( settings, TR_PREFS_KEY_QUEUE_STALLED_ENABLED, &boolVal ) ) + tr_sessionSetQueueStalledEnabled( session, boolVal ); if( tr_bencDictFindInt( settings, TR_PREFS_KEY_DOWNLOAD_QUEUE_SIZE, &i ) ) tr_sessionSetQueueSize( session, TR_DOWN, i ); if( tr_bencDictFindBool( settings, TR_PREFS_KEY_DOWNLOAD_QUEUE_ENABLED, &boolVal ) ) @@ -2674,6 +2678,23 @@ tr_sessionSetQueueStalledMinutes( tr_session * session, int minutes ) } +void +tr_sessionSetQueueStalledEnabled( tr_session * session, bool is_enabled ) +{ + assert( tr_isSession( session ) ); + assert( tr_isBool( is_enabled ) ); + + session->stalledEnabled = is_enabled; +} + +bool +tr_sessionGetQueueStalledEnabled( const tr_session * session ) +{ + assert( tr_isSession( session ) ); + + return session->stalledEnabled; +} + int tr_sessionGetQueueStalledMinutes( const tr_session * session ) { diff --git a/libtransmission/session.h b/libtransmission/session.h index 5e834a044..3cc9f4e70 100644 --- a/libtransmission/session.h +++ b/libtransmission/session.h @@ -111,6 +111,7 @@ struct tr_session tr_benc removedTorrents; + bool stalledEnabled; bool queueEnabled[2]; int queueSize[2]; int queueStalledMinutes; diff --git a/libtransmission/torrent.c b/libtransmission/torrent.c index 2ccedf661..d34d85dc0 100644 --- a/libtransmission/torrent.c +++ b/libtransmission/torrent.c @@ -1141,7 +1141,8 @@ torrentGetIdleSecs( const tr_torrent * tor ) bool tr_torrentIsStalled( const tr_torrent * tor ) { - return torrentGetIdleSecs( tor ) > ( tr_sessionGetQueueStalledMinutes( tor->session ) * 60 ); + return tr_sessionGetQueueStalledEnabled( tor->session ) + && ( torrentGetIdleSecs( tor ) > ( tr_sessionGetQueueStalledMinutes( tor->session ) * 60 ) ); } diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index 187a3bb4b..6e764d928 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -209,6 +209,7 @@ const char* tr_getDefaultDownloadDir( void ); #define TR_PREFS_KEY_SEED_QUEUE_SIZE "seed-queue-size" #define TR_PREFS_KEY_SEED_QUEUE_ENABLED "seed-queue-enabled" #define TR_PREFS_KEY_RPC_WHITELIST "rpc-whitelist" +#define TR_PREFS_KEY_QUEUE_STALLED_ENABLED "queue-stalled-enabled" #define TR_PREFS_KEY_QUEUE_STALLED_MINUTES "queue-stalled-minutes" #define TR_PREFS_KEY_DSPEED_KBps "speed-limit-down" #define TR_PREFS_KEY_DSPEED_ENABLED "speed-limit-down-enabled" @@ -801,6 +802,9 @@ void tr_sessionSetQueueEnabled ( tr_session *, tr_direction, bool do_limit_simu /** @brief Return true if we're limiting how many torrents can concurrently download (TR_DOWN) or seed (TR_UP) at the same time */ bool tr_sessionGetQueueEnabled ( const tr_session *, tr_direction ); +/** +**/ + /** @brief Consider torrent as 'stalled' when it's been inactive for N minutes. Stalled torrents are left running but are not counted by tr_sessionGetQueueSize(). */ void tr_sessionSetQueueStalledMinutes( tr_session *, int minutes ); @@ -808,6 +812,15 @@ void tr_sessionSetQueueStalledMinutes( tr_session *, int minutes ); /** @return the number of minutes a torrent can be idle before being considered as stalled */ int tr_sessionGetQueueStalledMinutes( const tr_session * ); +/** @brief Set whether or not to count torrents idle for over N minutes as 'stalled' */ +void tr_sessionSetQueueStalledEnabled( tr_session *, bool ); + +/** @return true if we're torrents idle for over N minutes will be flagged as 'stalled' */ +bool tr_sessionGetQueueStalledEnabled( const tr_session * ); + +/** +**/ + /** @brief Set a callback that is invoked when the queue starts a torrent */ void tr_torrentSetQueueStartCallback( tr_torrent * torrent, void (*callback)( tr_torrent *, void * ), void * user_data );