(trunk libT) performance improvements to peer-mgr.c's peerIsInUse()

This commit is contained in:
Charles Kerr 2009-11-28 07:15:31 +00:00
parent aa4389082a
commit d1f9b8ddee
1 changed files with 12 additions and 25 deletions

View File

@ -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;