(trunk libT) performance improvements to peer-mgr.c's peerIsInUse()
This commit is contained in:
parent
aa4389082a
commit
d1f9b8ddee
|
@ -114,6 +114,7 @@ enum
|
||||||
*/
|
*/
|
||||||
struct peer_atom
|
struct peer_atom
|
||||||
{
|
{
|
||||||
|
tr_peer * peer; /* will be NULL if not connected */
|
||||||
uint8_t from;
|
uint8_t from;
|
||||||
uint8_t flags; /* these match the added_f flags */
|
uint8_t flags; /* these match the added_f flags */
|
||||||
uint8_t myflags; /* flags that aren't defined in added_f */
|
uint8_t myflags; /* flags that aren't defined in added_f */
|
||||||
|
@ -309,22 +310,6 @@ peerCompare( const void * a, const void * b )
|
||||||
return tr_compareAddresses( tr_peerAddress( a ), tr_peerAddress( b ) );
|
return tr_compareAddresses( tr_peerAddress( a ), tr_peerAddress( b ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
peerCompareToAddr( const void * a, const void * vb )
|
|
||||||
{
|
|
||||||
return tr_compareAddresses( tr_peerAddress( a ), vb );
|
|
||||||
}
|
|
||||||
|
|
||||||
static tr_peer*
|
|
||||||
getExistingPeer( Torrent * torrent,
|
|
||||||
const tr_address * addr )
|
|
||||||
{
|
|
||||||
assert( torrentIsLocked( torrent ) );
|
|
||||||
assert( addr );
|
|
||||||
|
|
||||||
return tr_ptrArrayFindSorted( &torrent->peers, addr, peerCompareToAddr );
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct peer_atom*
|
static struct peer_atom*
|
||||||
getExistingAtom( const Torrent * t,
|
getExistingAtom( const Torrent * t,
|
||||||
const tr_address * addr )
|
const tr_address * addr )
|
||||||
|
@ -335,16 +320,15 @@ getExistingAtom( const Torrent * t,
|
||||||
}
|
}
|
||||||
|
|
||||||
static tr_bool
|
static tr_bool
|
||||||
peerIsInUse( const Torrent * ct,
|
peerIsInUse( const Torrent * ct, const struct peer_atom * atom )
|
||||||
const tr_address * addr )
|
|
||||||
{
|
{
|
||||||
Torrent * t = (Torrent*) ct;
|
Torrent * t = (Torrent*) ct;
|
||||||
|
|
||||||
assert( torrentIsLocked ( t ) );
|
assert( torrentIsLocked ( t ) );
|
||||||
|
|
||||||
return getExistingPeer( t, addr )
|
return ( atom->peer != NULL )
|
||||||
|| getExistingHandshake( &t->outgoingHandshakes, addr )
|
|| getExistingHandshake( &t->outgoingHandshakes, &atom->addr )
|
||||||
|| getExistingHandshake( &t->manager->incomingHandshakes, addr );
|
|| getExistingHandshake( &t->manager->incomingHandshakes, &atom->addr );
|
||||||
}
|
}
|
||||||
|
|
||||||
static tr_peer*
|
static tr_peer*
|
||||||
|
@ -353,6 +337,8 @@ peerConstructor( struct peer_atom * atom )
|
||||||
tr_peer * peer = tr_new0( tr_peer, 1 );
|
tr_peer * peer = tr_new0( tr_peer, 1 );
|
||||||
tr_bitsetConstructor( &peer->have, 0 );
|
tr_bitsetConstructor( &peer->have, 0 );
|
||||||
peer->atom = atom;
|
peer->atom = atom;
|
||||||
|
atom->peer = peer;
|
||||||
|
peer->atom = atom;
|
||||||
return peer;
|
return peer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -363,7 +349,7 @@ getPeer( Torrent * torrent, struct peer_atom * atom )
|
||||||
|
|
||||||
assert( torrentIsLocked( torrent ) );
|
assert( torrentIsLocked( torrent ) );
|
||||||
|
|
||||||
peer = getExistingPeer( torrent, &atom->addr );
|
peer = atom->peer;
|
||||||
|
|
||||||
if( peer == NULL )
|
if( peer == NULL )
|
||||||
{
|
{
|
||||||
|
@ -395,6 +381,7 @@ peerDestructor( Torrent * t, tr_peer * peer )
|
||||||
tr_bitsetDestructor( &peer->have );
|
tr_bitsetDestructor( &peer->have );
|
||||||
tr_bitfieldFree( peer->blame );
|
tr_bitfieldFree( peer->blame );
|
||||||
tr_free( peer->client );
|
tr_free( peer->client );
|
||||||
|
peer->atom->peer = NULL;
|
||||||
|
|
||||||
tr_free( peer );
|
tr_free( peer );
|
||||||
}
|
}
|
||||||
|
@ -1517,7 +1504,7 @@ myHandshakeDoneCB( tr_handshake * handshake,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
tr_peer * peer = getExistingPeer( t, addr );
|
tr_peer * peer = atom->peer;
|
||||||
|
|
||||||
if( peer ) /* we already have this peer */
|
if( peer ) /* we already have this peer */
|
||||||
{
|
{
|
||||||
|
@ -2538,7 +2525,7 @@ getPeerCandidates( Torrent * t, const time_t now, int * setmeSize )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* we don't need two connections to the same peer... */
|
/* we don't need two connections to the same peer... */
|
||||||
if( peerIsInUse( t, &atom->addr ) )
|
if( peerIsInUse( t, atom ) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* no need to connect if we're both seeds... */
|
/* no need to connect if we're both seeds... */
|
||||||
|
@ -3025,7 +3012,7 @@ atomPulse( void * vmgr )
|
||||||
/* keep the ones that are in use */
|
/* keep the ones that are in use */
|
||||||
for( i=0; i<atomCount; ++i ) {
|
for( i=0; i<atomCount; ++i ) {
|
||||||
struct peer_atom * atom = atoms[i];
|
struct peer_atom * atom = atoms[i];
|
||||||
if( peerIsInUse( t, &atom->addr ) )
|
if( peerIsInUse( t, atom ) )
|
||||||
keep[keepCount++] = atom;
|
keep[keepCount++] = atom;
|
||||||
else
|
else
|
||||||
test[testCount++] = atom;
|
test[testCount++] = atom;
|
||||||
|
|
Loading…
Reference in New Issue