diff --git a/libtransmission/peer-mgr-private.h b/libtransmission/peer-mgr-private.h index 7e1b91806..6269b8360 100644 --- a/libtransmission/peer-mgr-private.h +++ b/libtransmission/peer-mgr-private.h @@ -28,7 +28,7 @@ typedef struct tr_peer unsigned int clientIsChoked : 1; unsigned int clientIsInterested : 1; unsigned int peerSupportsEncryption : 1; - unsigned int doDisconnect : 1; + unsigned int doPurge : 1; uint8_t from; uint16_t port; diff --git a/libtransmission/peer-mgr.c b/libtransmission/peer-mgr.c index e8e389920..a9b2dd2d6 100644 --- a/libtransmission/peer-mgr.c +++ b/libtransmission/peer-mgr.c @@ -653,7 +653,7 @@ msgsCallbackFunc( void * vpeer, void * vevent, void * vt ) const int clientIsSeed = tr_cpGetStatus( t->tor->completion ) != TR_CP_INCOMPLETE; const int peerIsSeed = e->progress >= 1.0; if( clientIsSeed && peerIsSeed ) - peer->doDisconnect = 1; + peer->doPurge = 1; break; } @@ -662,7 +662,7 @@ msgsCallbackFunc( void * vpeer, void * vevent, void * vt ) break; case TR_PEERMSG_GOT_ERROR: - peer->doDisconnect = 1; + peer->doPurge = 1; reconnectSoon( t ); break; @@ -1178,9 +1178,6 @@ shouldPeerBeDisconnected( Torrent * t, tr_peer * peer, int peerCount, int isSeed if( !t->isRunning ) /* the torrent is stopped... nobody should be connected */ return TRUE; - if( peer->doDisconnect ) /* someone set a `doDisconnect' flag somewhere */ - return TRUE; - /* when deciding whether or not to keep a peer, judge its responsiveness on a sliding scale that's based on how many other peers are available */ relaxStrictnessIfFewerThanN = @@ -1229,13 +1226,25 @@ reconnectPulse( void * vt UNUSED ) if( peers[i]->msgs != NULL ) ++liveCount; - /* disconnect from some peers */ - for( i=0; idoPurge ) { + tr_ptrArrayErase( t->peers, i, i+1 ); + freePeer( peer ); + --size; + --liveCount; + continue; + } + if( shouldPeerBeDisconnected( t, peer, liveCount, isSeeding ) ) { disconnectPeer( peer ); --liveCount; } + + ++i; } /* maybe connect to some new peers */