fix clientIsSnubbedBy() to work correctly when we're a seed

This commit is contained in:
Charles Kerr 2007-11-25 16:57:08 +00:00
parent 30417d10ab
commit d735989aec
1 changed files with 13 additions and 17 deletions

View File

@ -11,7 +11,7 @@
*/ */
#include <assert.h> #include <assert.h>
#include <string.h> /* memcpy, memcmp */ #include <string.h> /* memcpy, memcmp, strstr */
#include <stdlib.h> /* qsort */ #include <stdlib.h> /* qsort */
#include <stdio.h> /* printf */ #include <stdio.h> /* printf */
#include <limits.h> /* INT_MAX */ #include <limits.h> /* INT_MAX */
@ -1482,8 +1482,9 @@ struct ChokeData
{ {
tr_peer * peer; tr_peer * peer;
int rate; int rate;
int preferred; uint8_t preferred;
int doUnchoke; uint8_t preferred_t;
uint8_t doUnchoke;
}; };
static int static int
@ -1491,26 +1492,20 @@ compareChoke( const void * va, const void * vb )
{ {
const struct ChokeData * a = va; const struct ChokeData * a = va;
const struct ChokeData * b = vb; const struct ChokeData * b = vb;
if( a->rate > b->rate ) return -1;
/* primary key: larger speeds */ if( a->rate < b->rate ) return 1;
if( a->rate > b->rate ) if( a->preferred_t != b->preferred_t ) return a->preferred_t ? -1 : 1;
return -1; if( a->preferred != b->preferred ) return a->preferred ? -1 : 1;
if ( a->rate < b->rate )
return 1;
/* secondary key: perferred peers */
if( a->preferred != b->preferred )
return a->preferred ? -1 : 1;
return 0; return 0;
} }
static int static int
clientIsSnubbedBy( const tr_peer * peer ) clientIsSnubbedBy( const tr_peer * peer, int clientIsSeed )
{ {
assert( peer != NULL ); assert( peer != NULL );
return peer->peerSentPieceDataAt < (time(NULL) - SNUBBED_SEC); return !clientIsSeed
&& ( peer->peerSentPieceDataAt < (time(NULL) - SNUBBED_SEC ) );
} }
/** /**
@ -1548,7 +1543,8 @@ rechoke( Torrent * t )
node = &choke[size++]; node = &choke[size++];
node->peer = peer; node->peer = peer;
node->preferred = peer->peerIsInterested && !clientIsSnubbedBy(peer); node->preferred = peer->peerIsInterested && !clientIsSnubbedBy( peer, clientIsSeed );
node->preferred_t = node->preferred && peer->client && strstr( peer->client, "Transmission" );
node->rate = getWeightedThroughput( peer, clientIsSeed ); node->rate = getWeightedThroughput( peer, clientIsSeed );
} }