From 35f40bdfa656ae746302566f5c6cda29116c46ba Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Sat, 13 Dec 2008 22:52:15 +0000 Subject: [PATCH] (trunk libT) #1593: Setting upload to 0 kills all download --- libtransmission/session.c | 52 +++++++++++++++++++++++++--------- libtransmission/session.h | 3 ++ libtransmission/transmission.h | 29 ++++++++++--------- 3 files changed, 56 insertions(+), 28 deletions(-) diff --git a/libtransmission/session.c b/libtransmission/session.c index a4343ab4c..88cb212b2 100644 --- a/libtransmission/session.c +++ b/libtransmission/session.c @@ -287,10 +287,10 @@ tr_sessionInitFull( const char * configDir, h->isPortSet = publicPort >= 0; h->bandwidth = tr_bandwidthNew( h, NULL ); - tr_bandwidthSetDesiredSpeed( h->bandwidth, TR_UP, uploadLimit ); - tr_bandwidthSetDesiredSpeed( h->bandwidth, TR_DOWN, downloadLimit ); - tr_bandwidthSetLimited( h->bandwidth, TR_UP, useUploadLimit ); - tr_bandwidthSetLimited( h->bandwidth, TR_DOWN, useDownloadLimit ); + tr_sessionSetSpeedLimit ( h, TR_UP, uploadLimit ); + tr_sessionSetSpeedLimitEnabled( h, TR_UP, useUploadLimit ); + tr_sessionSetSpeedLimit ( h, TR_DOWN, downloadLimit ); + tr_sessionSetSpeedLimitEnabled( h, TR_DOWN, useDownloadLimit ); /* first %s is the application name second %s is the version number */ @@ -456,19 +456,26 @@ tr_sessionGetPortForwarding( const tr_handle * h ) **** ***/ +static void +updateBandwidth( tr_session * session, tr_direction dir ) +{ + const tr_bool zeroCase = session->speedLimit[dir] < 1 && session->isSpeedLimited[dir]; + + tr_bandwidthSetLimited( session->bandwidth, dir, session->isSpeedLimited[dir] && !zeroCase ); + + tr_bandwidthSetDesiredSpeed( session->bandwidth, dir, session->speedLimit[dir] ); +} + void tr_sessionSetSpeedLimitEnabled( tr_session * session, tr_direction dir, - int isLimited ) + tr_bool isLimited ) { - tr_bandwidthSetLimited( session->bandwidth, dir, isLimited ); -} + assert( session ); + assert( dir==TR_UP || dir==TR_DOWN ); -int -tr_sessionIsSpeedLimitEnabled( const tr_session * session, - tr_direction dir ) -{ - return tr_bandwidthIsLimited( session->bandwidth, dir ); + session->isSpeedLimited[dir] = isLimited; + updateBandwidth( session, dir ); } void @@ -476,14 +483,31 @@ tr_sessionSetSpeedLimit( tr_session * session, tr_direction dir, int desiredSpeed ) { - tr_bandwidthSetDesiredSpeed( session->bandwidth, dir, desiredSpeed ); + assert( session ); + assert( dir==TR_UP || dir==TR_DOWN ); + + session->speedLimit[dir] = desiredSpeed; + updateBandwidth( session, dir ); +} + +tr_bool +tr_sessionIsSpeedLimitEnabled( const tr_session * session, + tr_direction dir ) +{ + assert( session ); + assert( dir==TR_UP || dir==TR_DOWN ); + + return session->isSpeedLimited[dir]; } int tr_sessionGetSpeedLimit( const tr_session * session, tr_direction dir ) { - return tr_bandwidthGetDesiredSpeed( session->bandwidth, dir ); + assert( session ); + assert( dir==TR_UP || dir==TR_DOWN ); + + return session->speedLimit[dir]; } /*** diff --git a/libtransmission/session.h b/libtransmission/session.h index 130f2f8e3..3042a6879 100644 --- a/libtransmission/session.h +++ b/libtransmission/session.h @@ -65,6 +65,9 @@ struct tr_handle tr_bool isClosed; tr_bool useLazyBitfield; + tr_bool isSpeedLimited[2]; + int speedLimit[2]; + tr_encryption_mode encryptionMode; struct tr_event_handle * events; diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index 1e77c8ec4..f4165f5a6 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -565,25 +565,26 @@ typedef enum } tr_direction; -void tr_sessionSetSpeedLimitEnabled( tr_session * session, - tr_direction direction, - int isEnabled ); +void tr_sessionSetSpeedLimitEnabled ( tr_session * session, + tr_direction direction, + tr_bool isEnabled ); -double tr_sessionGetRawSpeed( const tr_session * session, - tr_direction direection ); +tr_bool tr_sessionIsSpeedLimitEnabled ( const tr_session * session, + tr_direction direction ); -double tr_sessionGetPieceSpeed( const tr_session * session, - tr_direction direection ); +void tr_sessionSetSpeedLimit ( tr_session * session, + tr_direction direction, + int KiB_sec ); -int tr_sessionIsSpeedLimitEnabled( const tr_session * session, - tr_direction direction ); +int tr_sessionGetSpeedLimit ( const tr_session * session, + tr_direction direction ); -void tr_sessionSetSpeedLimit( tr_session * session, - tr_direction direction, - int KiB_sec ); +double tr_sessionGetRawSpeed ( const tr_session * session, + tr_direction direction ); + +double tr_sessionGetPieceSpeed ( const tr_session * session, + tr_direction direction ); -int tr_sessionGetSpeedLimit( const tr_session * session, - tr_direction direction ); void tr_sessionSetPeerLimit( tr_session * session, uint16_t maxGlobalPeers ); -- 2.40.0